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
特征中包含的方法感兴趣。例如,sum
在 TraversableOnce
中定义如下:
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
更好。
考虑
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
特征中包含的方法感兴趣。例如,sum
在 TraversableOnce
中定义如下:
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
更好。