Element-wise sum of arrays in Scala
When you use an underscore as a placeholder in a function definition, it can only appear once (for each function argument position, that is, but in this case flatMap
takes a Function1
, so there's only one). If you need to refer to an argument more than once, you can't use the placeholder syntax—you'll need to give the argument a name.
As the other answers point out, you can use .map { case (x, y) => x + y }
or the tuple accessor version, but it's also worth noting that if you want to avoid a bunch of tuple allocations in an intermediate collection, you can write the following:
scala> (a, b).zipped.map(_ + _)
res5: Array[Int] = Array(0, 0, 0, 0, 0)
Here zipped
is a method that's available on pairs of collections that has a special map
that takes a Function2
, which means the only tuple that gets created is the (a, b)
pair. The extra efficiency probably doesn't matter much in most cases, but the fact that you can pass a Function2
instead of a function from pairs means the syntax is often a little nicer as well.
Try:
a.zip(b).map { case (x, y) => x + y }