在Clojure中对画眉中的集合应用多个过滤器

在Clojure中对画眉中的集合应用多个过滤器,clojure,Clojure,下面的代码 (let [coll [1 2 3 4 5] filters [#(> % 1) #(< % 5)]] (->> coll (filter (first filters)) (filter (second filters)))) 这很好,但是如何在不必显式命名的情况下应用coll中的所有过滤器呢 也许有更好的方法可以做到这一点,但理想情况下,我想知道一个可以替换上面(filter(first filters))(f

下面的代码

(let [coll [1 2 3 4 5]
      filters [#(> % 1) #(< % 5)]]
  (->> coll
       (filter (first filters))
       (filter (second filters))))
这很好,但是如何在不必显式命名的情况下应用coll中的所有过滤器呢

也许有更好的方法可以做到这一点,但理想情况下,我想知道一个可以替换上面(filter(first filters))(filter(second filters))的表达式


谢谢

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

(seq 
  (reduce #(clojure.set/intersection 
          (set %1) 
          (set %2)) (map #(filter % coll) filters)))
如果您可以使用集合代替seqs,则可以将上述代码简化如下:

(reduce clojure.set/intersection (map #(filter % coll) filters))
这应该起作用:-

(let [coll [1 2 3 4 5]
      filters [#(> % 1) #(< % 5)]]
  (filter (fn [x] (every? #(% x) filters)) coll)
)
(让[coll[1 2 3 4 5]
过滤器[#(>%1)#(<%5)]]
(过滤器(fn[x](每?#(%x)个过滤器))coll)
)
(让[coll[1 2 3 4 5]
过滤器[#(>%1)#(<%5)]]
(减少(fn[cf](过滤器fc))coll过滤器)
Clojure 1.3有一个新功能,您可以使用它:

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