Сопоставить последовательность функций с последовательностью - PullRequest
4 голосов
/ 03 марта 2011

Как можно сопоставить каждую функцию в последовательности функций с соответствующим значением в последовательности значений?:

(map '(sequence of functions) '(sequence of values))

n-я функция в последовательности функций должна применяться к n-му значению в последовательности значений. извините, если я не очень ясно.

например, скажем (def fns '(#(+ 1 %) #(- 1 %)) )

тогда (map (some-clever-function-of fns) '(0 0)) будет производить (1 -1), потому что #(+ 1 %) был сопоставлен с 1-м 0 и #(- 1 %) со 2-м.

Ответы [ 2 ]

10 голосов
/ 03 марта 2011
  • Передайте map более одной последовательности аргументов, и она будет делать именно то, что вы хотите. (map f seq1 seq2) ожидает, что f будет функцией, которая принимает два аргумента; map передаст первый элемент seq1 и первый элемент от seq2 до f, затем второй элемент каждого и т. Д. Как только закончится последовательность запросов, map останавливается, поэтому это работает и с бесконечными последовательностями.
  • Рассмотрите возможность использования векторов вместо списков в кавычках. Векторы выделяются как «данные», а не как «код», и вам не нужно их заключать в кавычки.
  • Ваш пример функций не делает то, что вы хотите; оба возвращают 1. Я подозреваю, что вы имели в виду #(+ % 1) и #(- % 1). Оба они в clojure.core, называются inc и dec соответственно.

Итак:

user> (map (fn [f x] (f x)) 
           [inc dec] 
           [0 0])
(1 -1)

Или:

user> (map #(%1 %2) [inc dec] [0 0])
(1 -1)
1 голос
/ 04 марта 2011

Я обычно определяю invoke функцию, которая действует как apply, но без свертывания списка:

(defn invoke [f & args]
  (apply f args))

(map invoke [+ -] [1 2] [3 4])
(4 -2) ; 1 + 3, 2 - 4
...