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

如何在clojure中组合两个或多个谓词?,clojure,Clojure,我想对单个值应用两个(或更多)谓词。例如,假设我想测试一个值是否为正整数: (defn posint? [n] (and (integer? n) (pos? n))) 确实如此,但是如果我想组合应用的谓词呢?我不想为每个可能的谓词组合编写一个函数。如果您希望以内联方式执行这些检查,那么下面可能就是您想要的 (defn predicate-test [fns t] "test all predicates against value t and return true iff a

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

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

确实如此,但是如果我想组合应用的谓词呢?我不想为每个可能的谓词组合编写一个函数。

如果您希望以内联方式执行这些检查,那么下面可能就是您想要的

(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)

在Clojure 1.3中,实际上有一个名为
each pred
的内置函数来实现这一点。看


如果要在
关系中组合它们,请使用
每个pred

((每个pred位置?偶数?)5)
;假的
((每个pred位置?偶数?)6)
;真的
((每个pred位置?偶数?)-2)
;假的
如果您想将它们组合成
关系,请使用
一些fn

((某些fn位置?偶数?)5)
;真的
((某些fn位置?偶数?)6)
;真的
((某些fn位置?偶数?)-2)
;真的
((某些fn位置?偶数?)-3)
;假的

啊,是的,我缺少的是
juxt
函数。谢谢尽管此解决方案在执行
(posint?“a”)
时会引发异常,因为
pos?
会引发
CastException
。我想不出像
那样短路的方法。这个甚至可以处理
(posint?)
!不幸的是,我需要一个1.2的解决方案。@stand:我认为,您可以从Clojure源代码中获取这个函数,并将其放入您的代码中
(defn posint? [n]
  ((every-pred integer? pos?) n))