Если выводит тип в одном списке параметров, то это ограничение используется в последующих списках Param к правильно. (См. Много похожих вопросов о SO.)
Но ничего не происходит в списке параметров.
Это не работает либо:
scala> def g[V <: A](b: V => V#B) = b
g: [V <: A](b: V => V#B)V => V#B
scala> g((c: C) => "")
<console>:11: error: type mismatch;
found : String("")
required: ?#B
?
означает, что он не зафиксировал V
, даже если он просто решил для V
.
Контраст:
scala> def k[V <: A](v: V)(f: V#B => V) = 42
k: [V <: A](v: V)(f: V#B => V)Int
scala> k(new C)(_ => new C)
res5: Int = 42
Текущий вариант использования является -Ytyper-debug
. Иногда можно понять выход.
Для вашего примера f(_ => new C)
вы можете увидеть, как он сбой сразу на x$1
, хотя он хочет, чтобы он вернулся и исправил себя.
| | | | |-- ((x$1) => new C()) : pt=?#B => ? BYVALmode-EXPRmode-POLYmode (site: value res0 in $iw)
<console>:11: error: missing parameter type
f(_ => new C)
^
| | | | | |-- new C() EXPRmode (site: value $anonfun in $iw)
| | | | | | |-- new C BYVALmode-EXPRmode-FUNmode-POLYmode (silent: value $anonfun in $iw)
| | | | | | | |-- new C EXPRmode-POLYmode-QUALmode (silent: value $anonfun in $iw)
| | | | | | | | |-- C FUNmode-TYPEmode (silent: value $anonfun in $iw)
| | | | | | | | | \-> C
| | | | | | | | \-> C
| | | | | | | \->()C
| | | | | | \-> C
| | | | | \-> <error> => C
| | | | solving for (V: ?V)
| | | | \-> C#B => C
Там также
http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#local-type-inference
Ваше решение переместить проблему: res0 ("42") не работает. –
Чтобы быть справедливым, вы только спрашивали, почему нижняя строка не компилируется. – acjay