2011-08-03 17 views
6

にツグミでコレクションに次のコードClojureの

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

を複数のフィルタを適用すると、私に素晴らしいです

(2 3 4) 

を与えますが、どのように私がすることなく、蔵ですべてのフィルタを適用します明示的に名前を付けますか?

これを行うにはもっと良い方法があるかもしれませんが、理想的には上記の(フィルタ(第1のフィルタ))(フィルタ(第2のフィルタ))を置き換えることができる式を知りたいと思います。

ありがとうございます!

答えて

17

Clojure 1.3には、新しいevery-pred関数があります。

1

私は、次の非常に誇りに思っていると言うことはできませんが、少なくともそれは無限のフィルターのために働くとことができます:あなたはそれが上記の単純化seqsの代わりにセットを使用することができる場合

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

コードは次のように:

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