map
それ自体は行いませんが、 と の組み合わせを使用concat
しrepeat
て、目的の結果を得ることができます。
(def x [1 2 3 4])
(def y [1 2 3 4 5])
(def z [1 2 3 4 5 6 7])
(map +
(concat x (repeat 0))
(concat y (repeat 0))
z) ; => (3 6 9 12 10 6 7)
concatとrepeatの API ドキュメントは次のとおりです。
そして、これを少し抽象化する方法のスケッチを次に示します。そのため、どのコレクションが最も長いかを知る必要はありません。(上記のスニペットでは、concat
すべてのコレクションに(repeat 0)
無限のシーケンスがある場合)。
(defn map-longest
[f default & colls]
(lazy-seq
(when (some seq colls)
(cons
(apply f (map #(if (seq %) (first %) default) colls))
(apply map-longest f default (map rest colls))))))
(map-longest +
0
[1 2 3 4]
[1 2 3 4 5]
[1 2 3 4 5 6 7]) ; => (3 6 9 12 10 6 7)
Stack Overflow に関するこの前の質問に対する回答として、他のいくつかのアプローチを確認できます。