这有效:(1 to 5).reduceLeft( _+_ )
但这不是:(x:Int,y:Int)=>_+_
<console>:8: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
(x:Int,y:Int)=>_+_
^
<console>:8: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
(x:Int,y:Int)=>_+_
^
它是不一致的,因为在第一种情况下,匿名函数(_+_
)已成功编译,但在第二种情况下失败。
我有什么遗漏或错误的吗?或者只是语法定义?
答案 0 :(得分:9)
没有不一致。在第一种情况下,您将创建具有两个参数的匿名函数,然后添加这些参数,例如:
(1 to 5).reduceLeft((x, y) => x + y)
然而,在第二种情况下,您正在创建一个匿名函数,返回另一个带有两个参数的匿名函数:
(x: Int, y: Int) => ((a, b) => a + b)
(您似乎认为(x: Int, y: Int) => _+_
与(x: Int, y: Int) => x + y
相同,但事实并非如此。)
在第一种情况下,您在其参数类型已知的上下文中使用_ + _
(作为reduceLeft
的参数)。在第二种情况下,您似乎在一个上下文中使用它,在该上下文中无法推导出内部函数的参数类型,而这正是您的错误所在。