在Clojure中将多个过滤器应用于鹅口疮中的集合

时间:2011-08-03 14:19:23

标签: clojure

以下代码

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

给我

(2 3 4)

哪个好,但是如何在coll中应用所有过滤器而不必明确命名它们?

可能有更好的方法可以做到这一点,但理想情况下我想知道上面可以替换(过滤器(第一个过滤器))(过滤器(第二个过滤器))的表达式。

谢谢!

4 个答案:

答案 0 :(得分:18)

Clojure 1.3有一个新的every-pred函数,你可以这样使用它:

(filter (apply every-pred filters) coll)

答案 1 :(得分:13)

这应该有效: -

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

答案 2 :(得分:1)

我不能说我对以下内容感到非常自豪,但至少它起作用并允许无限过滤器:

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

如果您可以使用集合代替seqs,它将简化上述代码,如下所示:

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

答案 3 :(得分:1)

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