2012-07-19 4 views
10

私は要素によってシーケンスの要素を組み合わせたい、以下の配列に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] 

を行うのは利用可能な標準機能がありますそう?あるいは、それを行うための良い慣用方法は何ですか?

+0

関数型プログラミングにおける並列理解の特定の行為は通常「ビュン」と記載されています。いくつかの関数型言語は、 "マップ"と組み合わせて使用​​できる別の "zip"関数を持っていますが、他の言語は "ジップマップ"関数(単に "マップ"と呼ばれることもあります)を提供しています。 Clojureは後者の場合に該当します。 – Aaron

答えて

15

あなたが探している機能は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の中で、あなたはベクトルの結果を得るために、(mapと同じ引数で)mapvを使用することができます1.4.0+。

+3

+1「フレーズを入力する」 – Ashe

15

あなたは上記のClojure-1.4.0またはを使用している場合、あなたはmapvを使用することができます。

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