2011-08-03 101 views
6

應用多個過濾器,以收集在畫眉下面的代碼Clojure中

(let [coll [1 2 3 4 5] 
     filters [#(> % 1) #(< % 5)]] 
    (->> coll 
     (filter (first filters)) 
     (filter (second filters)))) 

給我

(2 3 4) 

這是偉大的,但如何讓所有過濾器的科爾,而不必明確命名它們?

可能有完全更好的方法來做到這一點,但理想情況下,我想知道一個可以代替(過濾器(第一過濾器))(過濾器(第二過濾器))的表達式。

謝謝!

回答

17

Clojure 1.3有一個新的every-pred功能,您可以這樣使用:

(filter (apply every-pred filters) coll) 
1

我不能說我很自豪以下的,但至少它的工作原理,並允許無限的過濾器:

(seq 
    (reduce #(clojure.set/intersection 
      (set %1) 
      (set %2)) (map #(filter % coll) filters))) 

如果你能在地方seqs這將簡化上述的使用套代碼如下:

(reduce clojure.set/intersection (map #(filter % coll) filters)) 
13

這應該工作: -

(let [coll [1 2 3 4 5] 
     filters [#(> % 1) #(< % 5)]] 
    (filter (fn [x] (every? #(% x) filters)) coll) 
) 
1
(let [coll [1 2 3 4 5] 
     filters [#(> % 1) #(< % 5)]] 
    (reduce (fn [c f] (filter f c)) coll filters))