scala 库中的聚合函数

Aggregation functions in the scala library

考虑

   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)

如我的评论所述,集合上已经定义了一个 sum 方法,尽管它需要对某些 ​​M[A].

隐式 Numeric[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 更好。