Вопрос по – Есть ли функция обратной карты?

4

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

<code>(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")
</code>

Ваш Ответ

3   ответа
5

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

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

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

Ладно, просто чтобы добавить идею, вот версия с той же сочетаемостью, что и у юкста. И это даже кажетсябыть ленивым !

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

Там & APOS; sjuxt что немного похоже. Он принимает несколько функций и возвращает функцию, которая передает свой аргумент (аргументы) каждой из функций и возвращает вектор возвращаемых значений. Так:

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

Основное отличие состоит в том, что он создает вектор, который, конечно, стремится (то есть не ленится).map создает последовательность, которая является ленивой.

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

> ((apply juxt [* / -]) 6 2)
[12 3 4]
@NielsK Вы правы, но я оставил заявку, чтобы показать, как ее можно использовать для & quot; fun-map & quot; последовательности функций, как просил аскер.
Apply не является действительно необходимым, хотя (juxt * / -) также подойдет.

Похожие вопросы