Применение последовательности функций к последовательности значений
Я хочу попарно применить список функций к списку значений.
вот пример для иллюстрации.
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)
это настолько кратким, насколько это ты получишь.