在Clojure Spec中,是否可以断言某些事物必须是谓词?
按谓词,我的意思是一个返回真/假值的函数。
我想在集合中存储一些谓词。但是有没有办法指定这个集合?
答案 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