2012-07-19 12 views
10

Ho le seguenti sequenzeCome combinare le sequenze in clojure?

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

voglio combinare l'elemento sequenze per elemento:

(... + a b c) 

Per dare me:

[111 222 333 444] 

C'è una funzione standard disponibile a fare così? O in alternativa qual è un buon modo idiomatico per farlo?

+0

La particolare atto di comprensione parallelo nella programmazione funzionale è solitamente descritto come "lampo". Alcune lingue funzionali hanno una funzione separata "zip" che può essere usata in congiunzione con "mappa" mentre altre lingue forniscono una funzione "zipmap" (a volte chiamata semplicemente "mappa"). Clojure cade nel secondo caso. – Aaron

risposta

15

La funzione che stai cercando è map.

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

Nota che map restituisce una sequenza pigro, e non un vettore, come mostrato nel tuo esempio. Ma puoi versare la sequenza pigra in un vettore vuoto usando la funzione into.

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

Inoltre, (per completezza, come si nota in un'altra risposta) in Clojure 1.4.0+ è possibile utilizzare mapv (con gli stessi argomenti map) al fine di ottenere un risultato di vettore.

+3

+1 uso della frase "versa la [sequenza] in ..." – Ashe

15

se si utilizza clojure-1.4.0 o superiore, è possibile utilizzare mapv:

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