部分应用的功能在Scala中不起作用

时间:2015-10-08 12:48:45

标签: scala

为什么我无法使用第g2行中的第二个参数调用g2(1, _: Int)(9)

g2(1, _: Int)返回一个函数<function1>,然后我用参数调用<function1>。同时在上面的示例中,我可以调用f3(9),但它与g2(1, _: Int)(9)恕我直言相同。

// OK

def f1: (Int, Int) => Int   =   _ + _
val f2: (Int, Int) => Int   =   f1
val f3: (Int) => Int        =   f2(1, _: Int)

println {
  f3(9)
}

// FAIL

def g1: (Int, Int) => Int   =   _ + _
val g2: (Int, Int) => Int   =   g1

println {
  g2(1, _: Int)(9) // Error: 'g2' does not take parameters 
}

2 个答案:

答案 0 :(得分:2)

这是匿名函数中下划线范围的问题。请参阅此处了解规则:What are the rules to govern underscore to define anonymous function?

根据上述链接中的规则1,g2(1, _: Int)(9)被解释为(x: Int) => g2(1, x)(9)。因此,您需要添加括号,以便规则2开始工作:(g2(1, _: Int))(9)

答案 1 :(得分:1)

当您添加评论时,(g2(1, _: Int))(9)有效。

Scala有多个参数列表,因此f(x)(y)(f(x))(y)的解析方式不同。由于g只接受一个参数列表,因此无法获取第二个参数列表,因此显式分组是必要的。

g2(1, _: Int)(9)表示:接受函数g2(x, y)(z),并应用参数x = 1, z = 9

(g2(1, _: Int))(9)表示:接受函数g2(x, y),并应用参数x = 1。然后将y = 9应用于生成的函数。