Clojure Spec中是否有一种方法可以断言某些事物必须是谓词

时间:2018-10-20 04:35:02

标签: clojure clojure.spec

在Clojure Spec中,是否可以断言某些事物必须是谓词?

按谓词,我的意思是一个返回真/假值的函数。

我想在集合中存储一些谓词。但是有没有办法指定这个集合?

1 个答案:

答案 0 :(得分:1)

可以使用fspec,但有一些警告:

  • 您必须指定一个:args规范;不只是:ret规范。如果谓词具有各种固定的ar可能会成为一个问题,或者可能会抛出无效的输入,例如(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