考虑
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)
答案 0 :(得分:1)
正如我的评论中所述,已经在集合上定义了sum
方法,但它需要对某些Numeric[A]
隐式M[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
会更好。