Это возможно при использовании fspec
с некоторыми оговорками:
- Вы должны указать
:args
spec;не просто :ret
спец.Это может быть проблемой, если предикаты имеют множество фиксированных арностей или могут выдавать недопустимые входные данные, например (pos? "1")
. - Каждый предикат в коллекции будет вызываться несколько раз каждый, чтобы убедиться, что они соответствуют спецификации..
Если все ваши предикаты принимают один вход, вы можете сделать что-то вроде этого:
(s/def ::pred (s/fspec :args (s/tuple any?) :ret boolean?))
(s/def ::pred-coll (s/coll-of ::pred))
(s/valid? ::pred-coll [boolean? number?]) => true
Чтобы проиллюстрировать, что предикаты будут вызваны:
(defn one? [x]
(prn x)
(= 1 x))
(s/valid? ::pred-coll [one?])
nil
()
:tL
(#uuid "9023252f-d4fe-4ee5-b526-13835cd52187")
...
=> true