Ошибка для скобок в определениях функций высшего порядка (Scala)
Я столкнулся с ошибкой с круглыми скобками в высоком разрешении. Следующий код отлично работает:
val foo: Int => (Int => Int) = n => n + _*2
Однако после добавления скобок возникает ошибка компилятора.
val foo1: Int => (Int => Int) = n => n + (_*2)
Error:(34, 56) missing parameter type for expanded function ((<x$5: error>) => x$5.$times(2))
Я знаю, что могу использовать другой стиль, чтобы избежать ошибки:
val bar = (x: Int) => (y: Int) => x + (y*2)
Интересно, в чем проблема со скобками и как их правильно использовать в едином стиле форматирования функций высокого порядка
1 ответ
Решение
Первый случай параметра заполнителя анонимной функции
val foo: Int => (Int => Int) =
n => n + _ * 2
расширяется до
val foo: Int => (Int => Int) =
(x: Int) => (n: Int) => n + x * 2
пока второй
val foo1: Int => (Int => Int) =
n => n + (_ * 2)
расширяется до
val foo1: Int => (Int => Int) =
n => n + (x => x * 2)
что является синтаксической ошибкой. Ключ в том, чтобы понять, что такое подчеркивание:
Если подчеркивание находится внутри выражения, разделенного () или {}, будет использоваться самый внутренний такой разделитель, который содержит подчеркивание;