考虑一下,我想实现一些函数,它将Long => T
应用于整数范围a..b
并累积类型T
的结果(这是练习,而不是搜索有效的解决方案)
def sum[T <: Number](f: Long => T)(a: Long, b: Long): T = {
def loop(acc: T, n: Long): T =
if (n > b)
acc
else
loop(acc + f(n), n + 1)
loop(0, a)
}
在loop(0,
抱怨
error: type mismatch;
found : Int(0)
required: T
loop(0, a)
我理解为什么,但是在这里给出数字类型T
0的选项是什么?如果有的话,当然。
答案 0 :(得分:2)
您应该使用Numeric
类型类作为通用T
。这样,您就可以访问方法zero
和plus
(因为每个Numeric
都必须定义这些方法),这样您就可以通常执行求和。
def sum[T](f: Long => T)(a: Long, b: Long)(implicit num: Numeric[T]): T = {
def loop(acc: T, n: Long): T =
if (n > b)
acc
else
loop(num.plus(acc, f(n)), n + 1)
loop(num.zero, a)
}
顺便说一下:这就是Scala内置的sum
方法所做的事情:
// from TraversableOnce
def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)