Применение последовательности функций к последовательности значений - PullRequest
7 голосов
/ 27 марта 2011

Я хочу попарно применить список функций к списку значений.

Вот пример для иллюстрации.

user=> (defn a [f x] (f x))
#'user/a
user=> (map a [inc dec] '(98 8))
(99 7)

Обратите внимание, что мне нужно было определить функцию a, которая принимает функцию и применяет ее к значению.В основном абстрагирование приложения-функции.

Есть ли более естественный способ сделать это?Мне бы очень хотелось использовать карту с определением вспомогательной функции.

Ответы [ 2 ]

8 голосов
/ 27 марта 2011

Вы всегда можете определить функции анонимно, inline:

(map (fn [f x] (f x)) [inc dec] '(98 8))

или короче, используя макрос читателя # ():

(map #(%1 %2) [inc dec] '(98 8))

Хотя это довольно неловкий случай использованияЯ сомневаюсь, что вы можете сократить его до чего-то более короткого, используя только базовые clojure или clojure.contrib, но вы можете легко написать свою собственную абстракцию:

(defn mapfs [fs coll] (map #(%1 %2) fs coll))
(mapfs [inc dec] [98 8])
> (99 7)
5 голосов
/ 27 марта 2011

Если вы хотите немного изменить формат ваших значений, все становится немного проще:

user=> (map apply [inc dec] [[98] [8]])
(99 7)

Это необходимо, потому что apply должен иметь seq в качестве последнего аргумента.Это преобразование ([98 8] => [[98] [8]]) в любом случае кажется разумным, поскольку в противном случае вы зависите от того факта, что функции могут принимать только одно значение за штуку.Это, конечно, тривиально:

user=> (map list [98 8])
((98) (8))

В противном случае функция сопоставления Джоста #(%1 %2) настолько лаконична, насколько вы собираетесь получить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...