Применение последовательности функций к последовательности значений

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

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

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

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

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

2 ответов


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

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

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

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

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

(defn mapfs [fs coll] (map #(%1 %2) fs coll))
(mapfs [inc dec] [98 8])
> (99 7)

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

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

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

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

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