Option.fold
この問題は、Scalas の型推論アルゴリズムとその定義方法の組み合わせの結果です。
Scalas の型推論は左から右に機能します。これは、式の可能な型を検索するために左端のシンボルから開始することを意味します。さらに、メソッド パラメーター リストの場合、これはジェネリック型が左端のパラメーター リストによって埋められた型にバインドされることを意味します。
scala> def meth[A](a1: A, a2: A) = (a1, a2)
meth: [A](a1: A, a2: A)(A, A)
scala> meth(1, "")
res7: (Any, Any) = (1,"")
scala> def meth[A](a1: A)(a2: A) = (a1, a2)
meth: [A](a1: A)(a2: A)(A, A)
scala> meth(1)("")
<console>:10: error: type mismatch;
found : String("")
required: Int
meth(1)("")
^
ご覧のとおり、最初のケースAny
では が推論されますが、2 番目のケースでは、 の型がA
最初のパラメーター リストによってバインドされ、2 番目のケースではそれ以上変更できないため、コンパイラ エラーがスローされます。
ただし、問題のメソッド呼び出しを機能させるために、結果の型はOption
、2 番目のパラメーター リストに到達するまで定義されない場合があります。これには右から左への型推論が必要なため、エラーが発生します。これは次のものと多少同じですList.fold
:
scala> List(1).foldLeft(Nil)((xs,x) => x::xs)
<console>:8: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1).foldLeft(Nil)((xs,x) => x::xs)
^
コードを機能させるには、結果のコレクションのタイプを明示的に指定する必要があります。例については@rks の回答を参照してください。
定義されているように定義されている理由の完全な説明については、ここでの議論を参照してください。要するにOption
、多くの点でコレクションの設計に従います。したがって、コレクションと同じように動作する場合はより明確になります。