2011-12-22 20 views
18

Tengo dos listas, quiero sumar cada elemento en la lista A con el elemento en la lista B, produciendo una nueva lista.¿La forma más simple de sumar dos listas en Scala?

puedo hacerlo con:

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

¿Hay alguna forma más simple o más ordenado hacer esto en Scala?

En Clojure que sólo puede hacer:

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

Lisp-y 'map's normalmente trabajan con funciones que toman cualquier cantidad de entradas. Scala, Haskell y sus amigos, por otro lado, solo definen 'map' para las funciones que toman 1 entrada. Por lo tanto, en Scala, siempre tendrá que realizar alguna forma de compresión para meter múltiples entradas en una sola tupla. –

+0

Lisp parece agradable de alguna manera. – Phil

+0

También tenga en cuenta que 'map' en lisp es similar a lo que estoy acostumbrado a llamar a' zipWith', 'zipWith3', etc. en Haskell. –

Respuesta

38

Durante dos listas:

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

Por tres listas:

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

Para n listas:

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

La respuesta de missingfaktor es lo que también habría recomendado.

Pero incluso se podría mejorar el fragmento de deshacerse de la utilización de los torpes _1, _2:

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

Otra manera de simplificar:

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

En Scalaz:

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

Funciona también para listas con diferentes tamaños: List(1,2,3) merge List(5,5) devolverá List(6,7,3)

Cuestiones relacionadas