Есть ли способ в Clojure Spec утверждать, что что-то должно быть предикатом - PullRequest
0 голосов
/ 20 октября 2018

В Clojure Spec, есть ли способ утверждать, что что-то должно быть предикатом?

Под предикатом я подразумеваю функцию, которая возвращает значение true / false.

Мне бы хотелосьхранить некоторые предикаты в коллекции.Но есть ли способ спецификации этой коллекции?

1 Ответ

0 голосов
/ 20 октября 2018

Это возможно при использовании 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
...