Ошибка для скобок в определениях функций высшего порядка (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)

что является синтаксической ошибкой. Ключ в том, чтобы понять, что такое подчеркивание:

Если подчеркивание находится внутри выражения, разделенного () или {}, будет использоваться самый внутренний такой разделитель, который содержит подчеркивание;