Объяснение "несвязанного параметра-заполнителя"

Вопрос

Почему случай 2 вызывает "несвязанный параметр-заполнитель", а случай 1 - в порядке?

Случай 1

val h: (Int => Int) = (x:Int) => { scala.util.Random.nextInt(x) }
val _h: (Int => Int) = { scala.util.Random.nextInt(_) }
h(5)     // 3
_h(5)    // 3

Случай 2

val f: (Int => Int) = (x:Int) => { x }
f(5)     // 5
// Causes error
val _f: (Int => Int) = { _ }   <----- unbound placeholder parameter

2 ответа

Решение

.nextInt(_)не является примером использования заполнителя. В этом случае подчеркивание_ используется для "эта-расширения" nextInt()метод, т.е. продвижение метода до надлежащей функции. Результат эквивалентен следующему:

val _h: (Int => Int) = util.Random.nextInt

Чтобы получить свой _f() код для работы, вы могли бы это сделать.

val _f: (Int => Int) = identity

_ никогда не интерпретируется как x => x в Scala.

Если я правильно понимаю часть языковой спецификации, в которой говорится о "привязке разделов подчеркивания", это именно потому, что Scala резервирует_для частичного применения. Как в случаеscala.util.Random.nextInt(_) это означает x => nextInt(x) и нет nextInt(x => x).

Другие вопросы по тегам