Применение нескольких фильтров к коллекции в молочнице в Clojure - PullRequest
9 голосов
/ 03 августа 2011

следующий код

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

дает мне

(2 3 4)

Что здорово, но как применить все фильтры в coll без явного имени?

Возможно, есть более эффективные способы сделать это, но в идеале я хотел бы знать выражение, которое можно заменить (фильтр (первые фильтры)) (фильтр (вторые фильтры)) выше.

Спасибо!

Ответы [ 4 ]

18 голосов
/ 03 августа 2011

Clojure 1.3 имеет новую функцию every-pred, которую вы можете использовать следующим образом:

(filter (apply every-pred filters) coll)
13 голосов
/ 03 августа 2011

Это должно работать: -

(let [coll [1 2 3 4 5]
      filters [#(> % 1) #(< % 5)]]
  (filter (fn [x] (every? #(% x) filters)) coll)
)
1 голос
/ 03 августа 2011
(let [coll [1 2 3 4 5]
      filters [#(> % 1) #(< % 5)]]
  (reduce (fn [c f] (filter f c)) coll filters))
1 голос
/ 03 августа 2011

Не могу сказать, что очень горжусь следующим, но, по крайней мере, это работает и допускает бесконечные фильтры:

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

Если вы можете использовать наборы вместо seqs, это упроститвышеуказанный код выглядит следующим образом:

(reduce clojure.set/intersection (map #(filter % coll) filters))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...