1

私はいくつかの Scala を選択しようとしていますが、興味深い機能の中で、ジェネリック (入力型) を持つ関数を見つけましたか? 特に便利です。ただし、次のコードを試してみると、

def recFunc[A](xs: List[A], base : () => A) : A = if (xs.isEmpty) base() else xs.head + recFunc(xs.tail, base)

以下に書かれた迷惑なエラーが表示されます。

<console>:8: error: type mismatch;
 found   : List[A]
 required: List[String]
   def recFunc[A](xs: List[A], base : () => A) : A = if (xs.isEmpty) base() else xs.head + recFunc(xs.tail.asInstanceOf[List[A]], base)

いったい、型推論システムは A == String を思いつき、この例外をスローします。この構造の使い方を完全に間違えたのでしょうか?

どうも

4

3 に答える 3

1

+メソッドが type で使用できることを保証しませんA。したがって、コンパイラは に変換AStringます。

1 つの解決策は、型クラスを使用することです。

trait Addable[A] {
    def plus(x: A, y: A): A
}

recFunc[A:Addable]…

ここで尖塔の短いイントロを見ることができます: http://typelevel.org/blog/2013/07/07/generic-numeric-programming.html

于 2013-10-25T18:37:34.747 に答える
1

問題は、ジェネリック型 A に対して + を呼び出すことです。コンパイラは + を使用するもの (文字列など) を推論しようとし、エラーが発生します。+で何を達成したいのかもわかりません。

于 2013-10-25T18:15:00.350 に答える