我想將兩個(或更多)謂詞應用於單個值。例如,假設我想測試一個值是一個正整數:你如何在clojure中構造兩個或多個謂詞?
(defn posint? [n]
(and (integer? n) (pos? n)))
這就行了,但如果我想編寫應用的謂詞是什麼?我不想爲每個可能的謂詞組合寫一個函數。
我想將兩個(或更多)謂詞應用於單個值。例如,假設我想測試一個值是一個正整數:你如何在clojure中構造兩個或多個謂詞?
(defn posint? [n]
(and (integer? n) (pos? n)))
這就行了,但如果我想編寫應用的謂詞是什麼?我不想爲每個可能的謂詞組合寫一個函數。
在Clojure中1.3居然還有叫every-pred
只是做這一個內置的功能。見here。
(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)
這個人甚至處理'(posint?「a」)'!不幸的是,我需要1.2解決方案。 – stand
@stand:我認爲,你可以從Clojure源代碼中獲取這個函數並將其放入你的代碼中 –