私はセクション6.26.4ローカル型推論specのは一種の何が起こっているのか説明してだと思います。コンパイラは最適な型を探します。型パラメータが反変である場合、選択される型は最大(この場合はAny)であり、そうでなければ(不変または共変)最小(この場合Int)です。
実際にはreduceLeft
には関連しない例がいくつかあります。私は通知が推論されたのは何
は、渡された匿名関数を見る前に発生するようです:
scala> List(1,2).reduceLeft(_.toString + _)
<console>:8: error: type mismatch;
found : java.lang.String
required: Int
List(1,2).reduceLeft(_.toString + _)
編集:
scala> List(1,2).reduceLeft[Any](_.toString + _)
res26: Any = 12
をしかし、私はタイプinferencerを助けていない場合私は無名関数が考慮されている間違った、この作品:
List(1,2).reduceLeft((_:Any).toString + (_:Any).toString)
それはそれに対して
_ + _
をチェックするために進んで、それは何らかの形でコンパイラは無名関数の期待されるタイプを想定していることを示します
List(1,2).reduceLeft(_+_)
(Int, Int) => Int
です:
あなたが上で実行することができますコンパイラ-Ytyper-debug
オプションがあります成功し、次にB
をInt
と推定します。ここスニペット:
typed immutable.this.List.apply[Int](1, 2).reduceLeft: [B >: Int](f: (B, Int) => B)B
adapted immutable.this.List.apply[Int](1, 2).reduceLeft: [B >: Int](f: (B, Int) => B)B to ?, undetparams=type B
typing ((x$1, x$2) => x$1.$plus(x$2)): pt = (Int, Int) => Int: undetparams=,
// some time later
typed ((x$1: Int, x$2: Int) => x$1.+(x$2)): (Int, Int) => Int
adapted ((x$1: Int, x$2: Int) => x$1.+(x$2)): (Int, Int) => Int to (Int, Int) => Int,
typed immutable.this.List.apply[Int](1, 2).reduceLeft[Int](((x$1: Int, x$2: Int) => x$1.+(x$2))): Int
型帰属の不存在下で無名関数を(Int, Int) => Int
であると仮定される理由を私は知りません。