したがって、問題は、Scalaの型推論がかなり制限されていることです。 最初のは、第1引数リスト(あなたの場合のリスト)を見て、を次に第2引数リスト(関数)にとします。しかし、それは戻っていません。
これは、なぜこの
List(1,2,3,4).foldLeft(Nil){(a,b) => b::a}
もこの
List(1,2,3,4).foldLeft(List()){(a,b) => b::a}
がうまくいくでもありません。どうして?まず、foldLeft
の署名は次のように定義されます
foldLeft[B](z: B)(f: (B, A) => B): B
あなたが最初の引数としてz
Nil
を使用するのであれば、コンパイラは型パラメータB
にNil.type
を割り当てます。 List()
を使用すると、コンパイラはB
にList[Nothing]
を使用します。
ここでは、2番目の引数f
の型が完全に定義されています。あなたのケースでは、それは
(Nil.type, Int) => Nil.type
または
(List[Nothing], Int) => List[Nothing]
のどちらかだとその戻り値の型がList[Int]
と推定されるので、どちらの場合も、ラムダ式(a, b) => b :: a
は、有効ではありません。
上記の太字部分は「引数リスト」であり、「引数」ではないことに注意してください。記事は後ほど説明します。情報は右のみ間で引数リストに左から、内左から右に引数リストを流れない
タイプ。
したがって、単一の引数リストを持つメソッドを使用すると状況がさらに悪化します。
実用的な理由はありますか?文脈とは何ですか? 'List [_]'は 'List [Int]'より2文字だけ短いためです。そしてリストを逆にするには、とにかく '.reverse'を使います。 – rolve
スカラーの型推論システムの限界を知るには実用的な理由はなく、ちょっと変わったかゆみです。 –
Ok。これに基づいて、私は理論的な答えを出しましたが、回避策はありませんでした。 – rolve