2011-10-27 30 views
14

我想將兩個(或更多)謂詞應用於單個值。例如,假設我想測試一個值是一個正整數:你如何在clojure中構造兩個或多個謂詞?

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

這就行了,但如果我想編寫應用的謂詞是什麼?我不想爲每個可能的謂詞組合寫一個函數。

回答

20

在Clojure中1.3居然還有叫every-pred只是做這一個內置的功能。見here

(defn posint? [n] 
    ((every-pred integer? pos?) n)) 
+0

這個人甚至處理'(posint?「a」)'!不幸的是,我需要1.2解決方案。 – stand

+2

@stand:我認爲,你可以從Clojure源代碼中獲取這個函數並將其放入你的代碼中 –

2

如果您正在尋找內聯進行這些檢查,以下可能是您正在尋找的內容。

(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) 
+0

啊是的,這是我失蹤的'juxt'功能。謝謝! – stand

+0

...雖然這個解決方案在執行'(posint?「a」)'時拋出一個異常,因爲'pos?'拋出了'CastException'。我想不出一種方法來使'和'的方式短路。 – stand