1

我在高阶定义中遇到圆括号错误。以下代码工作正常:

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)

我感兴趣的是括号的问题是什么以及如何以相同的格式正确使用它们来格式化高阶函数

4

1 回答 1

4

匿名函数占位符参数的第一种情况

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)

这是一个语法错误。关键是理解下划线的范围

如果下划线位于由 () 或 {} 分隔的表达式内,则将使用包含下划线的最里面的分隔符;

于 2020-04-29T00:36:28.640 回答