2011-08-03 6 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 함수가 있으므로 다음과 같이 사용할 수 있습니다.

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