Scala 语法部分

标签 scala

当我创建部分函数时,为什么不能立即调用它?

res6 和 res8 都是相同的类型(function1),所以我不确定 res7 如何工作(立即调用它)以及 res9 会失败

scala> ((x: Int) => x + 1)
res6: Int => Int = <function1>

scala> ((x: Int) => x + 1)(1)
res7: Int = 2

scala> def adder(a: Int, b: Int) = a + b
adder: (a: Int, b: Int)Int

scala> adder(1, _: Int)
res8: Int => Int = <function1>

scala> adder(1, _: Int)(1)
<console>:12: error: Int does not take parameters
       adder(1, _: Int)(1)
                       ^

scala> (adder(1, _: Int))(1)
res10: Int = 2

最佳答案

我认为您刚刚发现了 Scala 编译器的一个小怪癖。

我不知道这种情况在解析器中是如何准确实现的,但从表面上看,Scala 认为您正在调用一个具有多个参数列表的函数(形式为 f(...)(. ..))。因此,您需要在此处显式地用括号将部分应用的函数括起来,以便编译器可以消除 f()()f(_)() 形式之间的歧义。在 res8 中,函数后面没有任何参数,因此没有歧义。否则,如果省略参数列表,Scala 会要求您在函数后面添加下划线:f _f() _

您仍然可以立即应用该函数,如 res10 中所示。

关于Scala 语法部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38448605/

相关文章:

eclipse - Eclipse 中的编译器无法识别 Scala 源文件

scala - SBT:值(value)与应用

scala - 使用 dataframe : Collect return empty array 进行 Spark 单元测试

scala - 不可变映射使用什么样的数据结构?

java - DynamoDB - 如何检查现有表是否为空或非空

scala - 重复调用函数,直到返回 None

scala - Akka HTTP 高可用性

scala - 在 intellij idea HttpServletResponse 中运行 spark - ClassNotFoundException

Scala - List take - OrElse - 带默认值

scala - 在 Scala 中覆盖泛型特征的方法