我正在试图弄清楚如何在Scala中使用currying。
在以下代码段中:
object Foo {
def foo(a:Int)(b:Int)(c:Int) : Int = a + b + c
def main(a:Array[String]) {
val f = foo(1)(2) _
def g : Int => Int = foo(1)(2)
// def h = foo(1)(2)
println(f(3))
println(g(3))
// println(h(3))
}
}
f
和g
的定义,h
的定义不起作用:
/home/vlad/Desktop/b.scala:9: error: missing arguments for method foo in object Main;
follow this method with `_' if you want to treat it as a partially applied function
def h = foo(1)(2)
这是非法的原因是什么?在我看来,Scala应该能够在调用foo(1)(2)
之后发现你会留下Int => Int
。
答案 0 :(得分:9)
这是有意的。如果它被允许(某些语言确实允许),那么当你忘记放置一个参数时,这将使它工作,而不是你期望的编译时错误。这种情况经常发生,因为scala作者决定在这里进行权衡并禁止使用这种表示法。
马丁在他的书中讲到了这一点,请参阅"为什么尾随下划线?" http://www.artima.com/pins1ed/functions-and-closures.html#8.7