Невозможно понять поведение заполнителя _ в приложении функции scala

Welcome to Scala version 2.10.2
Type in expressions to have them evaluated.
Type :help for more information.

scala> val fn = (x:Int) => x+1
fn: Int => Int = <function1>

scala> val fn1 = fn _
fn1: () => Int => Int = <function0>

scala> val fn2 = fn1 _
fn2: () => () => Int => Int = <function0>

Я не понимаю, почему приложение-заполнитель (без предлагаемого типа) для функции создает новую функцию с карризацией с дополнительным аргументом void с префиксом.

Я ожидал ошибку компилятора или, по крайней мере, предупреждение.

1 ответ

Решение

Я думаю, что это так из-за принципа единого доступа: в REPL val является полем объекта, а не локальной переменной. И все не private[this] поля являются методами получения.

Итак, ваш код выглядит примерно так:

def fn() = (x:Int) => x+1
val fn1 = fn _ // () => fn()

Он работает как положено с локальными переменными:

scala> {
     |   val fn = (x:Int) => x+1
     |   val fn1 = fn _
     | }
<console>:10: error: _ must follow method; cannot follow Int => Int
                val fn1 = fn _
                          ^

Несмотря на то, что я могу объяснить, почему это работает таким образом, я все же думаю, что такое поведение можно считать ошибкой.

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