Scala currying和类型推断

时间:2015-11-20 11:34:00

标签: scala

我正在试图弄清楚如何在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))
  }
}

fg的定义,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

1 个答案:

答案 0 :(得分:9)

这是有意的。如果它被允许(某些语言确实允许),那么当你忘记放置一个参数时,这将使它工作,而不是你期望的编译时错误。这种情况经常发生,因为scala作者决定在这里进行权衡并禁止使用这种表示法。

马丁在他的书中讲到了这一点,请参阅"为什么尾随下划线?" http://www.artima.com/pins1ed/functions-and-closures.html#8.7