2011-12-22 23 views
18

Ho due elenchi, voglio sommare ogni elemento nell'elenco A con l'elemento nell'elenco B, producendo un nuovo elenco.Il modo più semplice per sommare due elenchi in Scala?

posso farlo con:

List(1,2).zip(List(5,5)).map(t => t._1 + t._2) 

C'è un modo più semplice o più ordinato di fare questo a Scala?

In Clojure posso solo fare:

(map + [1 2 3] [4 5 6]) 
+1

Lisp-y 'map's in genere funziona con funzioni che accettano un numero qualsiasi di input. Scala, Haskell e gli amici, d'altra parte, definiscono solo 'map' per le funzioni che accettano 1 input. Quindi, in Scala, avrai sempre bisogno di eseguire qualche forma di zipping per racchiudere più input in una singola tupla. –

+0

Lisp sembra carino in qualche modo. – Phil

+0

Nota anche 'map' in lisp è simile a quello che sono solito chiamare' zipWith', 'zipWith3', etc in Haskell. –

risposta

38

Per due liste:

(List(1,2), List(5,5)).zipped.map(_ + _) 

Per tre liste:

(List(1,2), List(5,5), List(9, 4)).zipped.map(_ + _ + _) 

Per le liste n:

List(List(1, 2), List(5, 5), List(9, 4), List(6, 3)).transpose.map(_.sum) 
9

La risposta di missingfaktor è ciò che avrei raccomandato anche io.

Ma si potrebbe anche migliorare il tuo snippet per sbarazzarsi di utilizzare il goffo _1, _2:

List(1,2) zip List(5,5) map { case (a, b) => a + b } 
3

Un altro modo per semplificare:

import Function.tupled 
List(1,2).zip(List(5,5)) map tupled {_ + _} 
0

In Scalaz:

List(1,2) merge List(5,5) 

Funziona anche per elenchi con dimensioni diverse: List(1,2,3) merge List(5,5) restituirà List(6,7,3)

Problemi correlati