2017-12-14 1 views
1

함수를 정의하고 있는데,이 함수는 함수로 재 배열 될 배열을 취합니다. 이 반환 된 함수는 필터 명령의 첫 번째 인수입니다. 두 번째 인수는 내 필터 명령을 실행하면 내가다이나믹 함수가 포함 된 클로저 필터 사용하기

(def persons '({:id 1 :name "olleš"} {:id 2 :name "anna"} {:id 3 :name "isak"} {:id 4 :name "beatrice"})) 

을 정의한이 테이블은

seminar.core=> (filter (fn [word func arg] (func word arg)) [:id > 2] persons) 

내가 행동하는 내 필터 기능을 원하는

ArityException Wrong number of args (3) passed to: core/filter clojure.lang.AFn.throwArity (AFn.java:429) 

이 오류를받을 아래의 것과 유사하게

(filter #(< (:id %) 2) persons) 
({:id 1, :name "olle"}) 
+0

당신은'기입 : id','>'와''에 대한 2' (FN [word func arg] (func word arg))', 인수가 더 이상 남아 있지 않습니다 - 필터링 할 항목을 어디에 전달합니까? –

답변

1

간단한 물건을 들어, 난 그냥 익명 함수를 사용합니다 :

(filter #(> (:id %) 2) persons) 

    => ({:id 3, :name "isak"} {:id 4, :name "beatrice"}) 

또 다른 해결책은 술어 - 생성 함수를 작성하는 대신 인라인 그 일을하는 것입니다.

(defn build-pred 
    [word func arg] 
    (fn [item] 
    (func (word item) arg))) 

(filter (build-pred :id > 2) persons)) 

    => ({:id 3, :name "isak"} {:id 4, :name "beatrice"}) 

정말 destructuring 단지 사용, 벡터로 인수를 전달하려면 :

(defn build-pred-vec 
    [[word func arg]] 
    (fn [item] 
    (func (word item) arg))) 

(filter (build-pred-vec [:id > 2]) persons) 
1

이 부분 응용 프로그램에 대한 작업입니다 : - item

다음
(filter 
    (partial 
    (fn [word func arg item] (func (word item) arg)) 
    :id > 2) 
    persons) 

, 우리는 부분적으로 word, func 이미 채워 arg, 또 다른 인수를두고있다 함수의 버전을 적용 만들 - - 필터링중인 항목에 대해 엽니 다.

관련 문제