Curried Scala函数中的参数顺序

the*_*Sin 0 scala currying

在Scala中,我可以像这样生成一个curried函数:

def multiply(m: Int)(n: Int): Int = (m + 1) * (n + 2)
Run Code Online (Sandbox Code Playgroud)

如果我想,我可以通过填充第一个参数来生成一个新函数,如下所示:

val timesTwo = multiply(1) _
Run Code Online (Sandbox Code Playgroud)

但是替换第二个参数而不是第一个参数的语法是什么?

val timesThree = multiply _ (1)  // Incorrect Syntax
Run Code Online (Sandbox Code Playgroud)

更重要的是,为什么没有直接平行multiply(1) _

win*_*ner 8

val timesThree = multiply(_: Int)(1)
Run Code Online (Sandbox Code Playgroud)

要么

val timesThree = (x: Int) => multiply(x)(1)
Run Code Online (Sandbox Code Playgroud)

  • 请参阅Scala参考资料的第6.7节(http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf).`multiply(1)_`中的_不是匿名函数参数的占位符,就像它在`multiply(_:Int)中一样,而是强制将方法转换为函数的特殊语法("eta-expansion") .至于为什么需要显式类型,我不知道. (2认同)