1

这有效:(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)=>_+_
                               ^

这是不一致的,因为在第一种情况下,匿名函数 ( _+_) 编译成功,但在第二种情况下失败。

有什么我错过或误解的吗?还是只是语法定义?

4

1 回答 1

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)。在第二种情况下,您似乎在无法推断内部函数参数类型的上下文中使用它,而这正是您的错误所在。

于 2014-05-25T06:57:22.723 回答