0

考虑一下,我想实现一些函数,该函数将应用于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 的选项是什么?如果有的话,当然可以。

4

1 回答 1

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)
于 2012-09-25T19:37:56.803 回答