Как объединить последовательности в clojure?

Имею следующие последовательности

(def a [1 2 3 4])
(def b [10 20 30 40])
(def c [100 200 300 400])

Я хочу объединить элемент последовательностей по элементу:

(...  + a b c)

Чтобы дать мне:

[111 222 333 444]

Доступна ли стандартная функция? Или, альтернативно, что такое хороший идиоматический способ сделать это?

Ответ 1

Функция, которую вы ищете, map.

(map + [1 2 3 4] [10 20 30 40] [100 200 300 400])
;=> (111 222 333 444)

Обратите внимание, что map возвращает ленивую последовательность, а не вектор, как показано в вашем примере. Но вы можете вылить ленивую последовательность в пустой вектор, используя функцию into.

(into [] (map + [1 2 3 4] [10 20 30 40] [100 200 300 400]))
;=> [111 222 333 444]

Кроме того, (для полноты, как указано в другом ответе) в Clojure 1.4.0+ вы можете использовать mapv (с теми же аргументами, что и map), чтобы получить векторный результат.

Ответ 2

если вы используете clojure -1.4.0 или выше, вы можете использовать mapv:

user> (mapv + [1 2 3 4] [10 20 30 40] [100 200 300 400])
[111 222 333 444]