高阶函数定义中的括号错误(Scala)

问题描述 投票:1回答: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)

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

scala compiler-errors higher-order-functions parentheses scala-placeholder-syntax
1个回答
3
投票

第一个匿名函数占位符参数

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)

这是语法错误。关键是要了解scope of underscore

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

© www.soinside.com 2019 - 2024. All rights reserved.