2012-04-06 4 views
4

В clojure вы можете сопоставить функцию с последовательностями значений. Есть ли встроенная функция для сопоставления одного значения в качестве параметра последовательности функций?Есть ли функция обратного отображения?

(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 создает последовательность, которая является ленивым (т.е. не лень.).

juxt также работает на функции, которые имеют более 1 аргумент:

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

Применить действительно не нужно, хотя, (juxt */-) будет делать также. – NielsK

+0

@NielsK Вы правы, но я оставил заявку, чтобы показать, как ее можно использовать для «fun-map» последовательностей функций, как просил запрошенный. –

5

Не уверен, что, если есть один, но это довольно легко реализовать:

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

Я бы сказал, использование juxt если лень не является необходимым, особенно из-за его способности сочинять. Однако простой вариант вашей обратной карты для полиадических функций, которая использует карту и повторить, что и ленивы, будет выглядеть следующим образом:

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

Хорошо, просто бросить в идее, вот версия с тем же композитоспособность 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) 
Смежные вопросы