Ошибка в скобках в определениях функций более высокого порядка (Scala) - PullRequest
1 голос
/ 29 апреля 2020

Я сталкиваюсь с ошибкой с круглыми скобками в определении высокого порядка. Следующий код работает нормально:

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 Ответ

4 голосов
/ 29 апреля 2020

В первом случае параметр-заполнитель анонимной функции

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)

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

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

...