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

sta*_*and 15 clojure

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

(defn posint? [n]
   (and (integer? n) (pos? n)))
Run Code Online (Sandbox Code Playgroud)

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

Jul*_*ang 21

在Clojure 1.3中,实际上有一个内置函数every-pred可以做到这一点.看到这里.

(defn posint? [n]
  ((every-pred integer? pos?) n))
Run Code Online (Sandbox Code Playgroud)

  • @stand:我认为,您可以从Clojure源中获取此函数并将其放入您的代码中 (2认同)

Did*_* A. 8

如果您想将它们组合成and关系,请使用every-pred

((every-pred pos? even?) 5)
;false
((every-pred pos? even?) 6)
;true
((every-pred pos? even?) -2)
;false
Run Code Online (Sandbox Code Playgroud)

如果您想将它们组合成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
Run Code Online (Sandbox Code Playgroud)