scala库中的聚合函数

时间:2015-01-27 21:55:30

标签: scala collections

考虑

   val myseq = Array(1,2,3,4,5)
   val mysum = myseq.foldLeft(0){_ + _}

sum(),count()等没有定义的聚合器吗?沿着:

   import math.SomeLibraryClass._

   val myseq = Array(1,2,3,4,5)
   val mysum = myseq.foldLeft(0.0)(sum) 

或者对于(基于行)总和的组的情况:

   val rowSums = rows.map {sum}

(默认情况下,初始值为0)

更新

所以从评论中可以看出,没有 static (基于scala对象)的方法,正确的语法是:

   val rowSums = rows.map {_.sum}

这是:

scala> val arr = Array(Array(1,2,3), Array(4,5,6))
arr: Array[Array[Int]] = Array(Array(1, 2, 3), Array(4, 5, 6))

scala> arr.map(_.sum)
res23: Array[Int] = Array(6, 15)

1 个答案:

答案 0 :(得分:1)

正如我的评论中所述,已经在集合上定义了sum方法,但它需要对某些Numeric[A]隐式M[A]

也许您可能对Numeric特征中包含的方法感兴趣。例如,sumTraversableOnce中定义如下:

def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)

从某种意义上说,Scala 确实sum等方法有一些静态引用。对于每种数字类型,标准库中有相当多的Numeric实例。 (seen here

例如,有IntIsIntegral,其中Numeric[Int]。您可以明确地使用它:

Array(1, 2, 3, 4, 5).fold(Numeric.IntIsIntegral.zero)(Numeric.IntIsIntegral.plus)

但你为什么要这样做?问题是,这只适用于Int,当要求隐式Numeric[A]适用于具有这种隐式定义的任何数字类型时。

这会中断,因为类型不同:

scala> Array(1.0, 2.0, 3.0, 4.0, 5.0).fold(Numeric.IntIsIntegral.zero)(Numeric.IntIsIntegral.plus)
<console>:8: error: type mismatch;
 found   : (Int, Int) => Int
 required: (AnyVal, AnyVal) => AnyVal
              Array(1.0,2.0,3.0,4.0,5.0).fold(Numeric.IntIsIntegral.zero)(Numeric.IntIsIntegral.plus)

所以,技术上是的,存在这样的功能。但在这种情况下使用Numeric会更好。