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ここで Numeric 型の 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 に答える