你如何在clojure中组成两个或多个谓词?

时间:2011-10-27 21:28:19

标签: clojure

我想将两个(或更多)谓词应用于单个值。例如,假设我想测试一个值是否为正整数:

(defn posint? [n]
   (and (integer? n) (pos? n)))

就是这样,但如果我想编写应用的谓词怎么办?我不想为每个可能的谓词组合编写函数。

3 个答案:

答案 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