我发现Scala的下划线不一致

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我发现Scala的下划线不一致相关的知识,希望对你有一定的参考价值。

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

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

有没有我错过或误解的东西?或者只是语法定义?

答案

没有不一致。在第一种情况下,您将创建具有两个参数的匿名函数,然后添加这些参数,即:

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

以上是关于我发现Scala的下划线不一致的主要内容,如果未能解决你的问题,请参考以下文章

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

Scala Eclipse代码出现下划线的问题解决

Scala Eclipse代码出现下划线的问题解决

Scala中的下划线[重复]

Scala 基础:Scala变量 标识符

跨活动的片段之间的共享元素转换不一致