[英]How do you use an existing vector of predicates with :post conditions in 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.