如何在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))