当我创建部分函数时,为什么不能立即调用它?
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/