如何在scala中获得元组数组的总和

如何在scala中获得元组数组的总和,scala,Scala,我有一个简单的元组数组 val arr = Array((1,2), (3,4),(5,6),(7,8),(9,10)) 我希望得到(1+3+5+7+9,2+4+6+8+10)元组作为答案 与常规数组类似,以元组形式获取和的最佳方法是什么。我试过了 val res = arr.foldLeft(0,0)(_ + _) 这是行不通的 很抱歉没有写上下文。我用它来烫伤小鸟。Algebird允许对元组求和,我认为这是可行的。那是我的错误。没有元组加法这样的东西,所以它不能工作。您必须对元组的每个坐

我有一个简单的元组数组

val arr = Array((1,2), (3,4),(5,6),(7,8),(9,10))
我希望得到
(1+3+5+7+9,2+4+6+8+10)
元组作为答案

与常规数组类似,以元组形式获取和的最佳方法是什么。我试过了

val res = arr.foldLeft(0,0)(_ + _)
这是行不通的


很抱歉没有写上下文。我用它来烫伤小鸟。Algebird允许对元组求和,我认为这是可行的。那是我的错误。

没有元组加法这样的东西,所以它不能工作。您必须对
元组的每个坐标进行操作:

val res = arr.foldLeft(0,0){ case (sum, next) => (sum._1 + next._1, sum._2 + next._2) }

res: (Int, Int) = (25,30)

这应该可以很好地工作:

arr.foldLeft((0,0)){ case ((a0,b0),(a1,b1)) => (a0+a1,b0+b1) }

没有为元组定义加法。

使用scalaz,它将元组定义为半群,允许您使用追加运算符
+

import scalaz._
import Scalaz._

arr.fold((0,0))(_ |+| _)

另一种选择

val (a, b) =  arr.unzip
                       //> a  : Array[Int] = Array(1, 3, 5, 7, 9)
                       //| b  : Array[Int] = Array(2, 4, 6, 8, 10)
(a.sum, b.sum)        
                      //> res0: (Int, Int) = (25,30)

这是无效的,它将遍历集合三次(解压,两次求和)。正确。这也很明显,我认为这也很重要。