我想将两个(或更多)谓词应用于单个值。例如,假设我想测试一个值是否为正整数:
(defn posint? [n]
(and (integer? n) (pos? n)))
就是这样,但如果我想编写应用的谓词怎么办?我不想为每个可能的谓词组合编写函数。
答案 0 :(得分:21)
在Clojure 1.3中,实际上有一个名为every-pred
的内置函数可以做到这一点。见here。
(defn posint? [n]
((every-pred integer? pos?) n))
答案 1 :(得分:2)
如果您希望内联进行这些检查,可能会出现以下情况。
(defn predicate-test [fns t]
"test all predicates against value t and return true iff all predicates return true."
(every? true? ((apply juxt fns) t)))
(predicate-test [integer? pos?] 4)
然后,您可以为最常用的谓词测试创建命名版本:
(def posint? (partial predicate-test [integer? pos?])
(posint? 4)
答案 2 :(得分:0)
如果您想以and
关系来构成它们,请使用every-pred
:
((every-pred pos? even?) 5)
;false
((every-pred pos? even?) 6)
;true
((every-pred pos? even?) -2)
;false
如果您想以or
关系来构成它们,请使用some-fn
:
((some-fn pos? even?) 5)
;true
((some-fn pos? even?) 6)
;true
((some-fn pos? even?) -2)
;true
((some-fn pos? even?) -3)
;false