1

こんにちは、私は C# から来た Scala にかなり慣れていません。

私は独自のバージョンのアキュムレート(フォールド)を作成しようとしていますが、なぜ次のような問題が発生しているのか疑問に思っています。

def accumulate[T](list : List[T], initial: T, f: (T, T) => T) : T = {
    @tailrec def loop[T](list: List[T], accum: T) : T =
      if(list.length == 0)
        accum
      else{
        val head : T = list.head
        val res : T = f(accum,head)
        loop[T](list.tail, res)
      }
    loop(list,initial)
  }

次のエラーが表示されます。

type mismatch;
 found   : accum.type (with underlying type T)
 required: T
        val res : T = f(accum,head)
                        ^

すべてが型 T であることを考えると、どのように型の不一致があるのか​​ わかりません。

どんな考え/助けもいただければ幸いです。

ブレア

4

2 に答える 2

5

loopメソッドから型パラメーターを削除するだけです。に置き換えloop[T]ますloop

loop[T]name で新しい型パラメーターを作成しているためT、メソッドTの外側loopとメソッドの内側は同じ名前の異なる型エイリアスです。Tloop

それはシャドーイングと呼ばれます。

同様の問題については、次の回答を参照してください。

  1. Scala 型パラメーター エラー、型パラメーターのメンバーではありません
  2. Scala、ジェネリック トレイトを持つ Extend オブジェクト
  3. Scala でのジェネリック型推論
于 2013-10-02T13:24:20.653 に答える
2

問題は、内側の関数を使用して、外側の型を隠してloopいる新しい型を定義していることです。TT

コンパイラは、それらを異なる型を定義していると見なします。(再帰呼び出しを含む)Tから型パラメーターを単純に削除すると、問題なくコンパイルされることがわかります。looploop(list.tail, res)

于 2013-10-02T13:25:14.267 に答える