Я думаю, что объяснение Дэвида Зоргеля, по сути, правильное: если тип T
имеет неявное преобразование в строку, тогда val bar = foo(3, _:T)
допустимо, давая функцию типа T => Int
, которая не связана с String => Int
.
Почему компилятор не делает разумного предположения (при отсутствии явной типизации), что тип на самом деле такой же, как в методе (что является сутью вашего вопроса), я не знаю - ямогу только догадываться, потому что это усложнит спецификацию языка.
Там, где типы не указаны, т.е. val bar = foo(_, _)
, кажется, что компилятор интерпретирует это как простое eta-преобразование, такое же, как val bar = foo _
, что делает* String => Int
.
Моя предпочтительная форма - указывать тип функции слева, что позволяет вам легко видеть тип bar
:
* 1016.*
Если у вас аллергия на повторный набор слова String
, вы можете написать
val bar = (foo _).curried(3)