簡體   English   中英

你如何在clojure中組成兩個或多個謂詞?

[英]How do you compose two or more predicates in clojure?

我想將兩個(或更多)謂詞應用於單個值。 例如,假設我想測試一個值是否為正整數:

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

這樣做,但如果我想組成應用的謂詞怎么辦? 我不想為每個可能的謂詞組合編寫函數。

在Clojure 1.3中,實際上有一個名為every-pred的內置函數可以做到這一點。 看到這里

(defn posint? [n]
  ((every-pred integer? 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)

如果你想在一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM