2012-04-06 2 views
4

클로저에서 함수를 일련의 값으로 매핑 할 수 있습니다. 단일 값을 매개 변수로 함수 시퀀스에 매핑하는 inbuilt 함수가 있습니까?역지도 기능이 있습니까?

(map inc [1 2 3 4]) 
; -> (2 3 4 5) 

(reverse-map [inc dec str] 1) 
; -> (2 0 "1") 

(reverse-map [str namespace name] :foo/bar/baz) 
; -> (":foo/bar/baz" "foo/bar" "baz") 

답변

9

약간 비슷합니다 juxt을있다. 그것은 여러 함수를 사용하고 인수를 각 함수에 전달하고 리턴 값의 벡터를 리턴하는 함수를 리턴합니다. 그래서 :

> ((apply juxt [inc dec str]) 1) 
[2 0 "1"] 

주된 차이는 물론 열심 인 벡터 생성하는 원문 map이 지연되는 시퀀스를 생성한다 (즉 지연되지 않음.). 게으름이 필요하지 않은 경우

> ((apply juxt [*/-]) 6 2) 
[12 3 4] 
+1

(juxt */-)도 마찬가지입니다. – NielsK

+0

@NielsK 맞습니다. 요청자가 요청한대로 함수의 순서를 "재미있게 맵핑"하는 데 사용하는 방법을 보여주기 위해 신청서를 남겼습니다. –

5

확실하지가 하나이지만, 그것은 구현하기 매우 쉽다 경우 :

(def reverse-map (fn [l value] (map #(% value) l))) 
2

나는 그것이 능력을 구성하는 것, 특히 때문에, 사용 juxt을 말할 것이다 :

juxt는 1 개 이상의 인수가 기능에서 작동합니다.

(defn reverse-map 
    [fcoll & args] 
    (map apply fcoll (repeat args))) 

=> (reverse-map [inc dec str] 1) 
(2 0 "1") 
=> (reverse-map [*/-] 6 2) 
(12 3 4) 

좋아, 아이디어에 던져, 여기에 같은과 버전이다 : 그러나 두 게으른지도와 반복을 사용 polyadic 기능에 대한 역방향 맵의 간단한 버전은 다음과 같을 것 juxt의 합성 가능성. 그리고 그것은 심지어 be lazy 것 같습니다!

(defn lazy-juxt 
    [& funs] 
    (fn [& args] 
    (map apply funs (repeat args)))) 

=> ((juxt inc dec str) 1) 
[2 0 "1"] 
=> ((lazy-juxt inc dec str) 1) 
(2 0 "1") 

=> ((juxt */-) 6 2) 
[12 3 4] 
=> ((lazy-juxt */-) 6 2) 
(12 3 4) 
관련 문제