为什么我不能重写
println(abc.foldRight(0)((a,b) => math.max(a.length,b)))
在
object Main {
def main(args : Array[String]) {
val abc = Array[String]("a","abc","erfgg","r")
println(abc.foldRight(0)((a,b) => math.max(a.length,b)))
}
}
到
println(abc.foldRight(0)(math.max(_.length,_)))
?
scala
口译员产量/path/to/Main.scala:4: error: wrong number of parameters; expected = 2
println(abc.foldRight(0)(math.max(_.length,_)))
^
one error found
这对我来说不够描述。生成的 lambda 是不是需要两个参数,其中一个是为 .length 方法调用的,如
abc.map(_.length)
?
最佳答案
abc.foldRight(0)(math.max(_.length, _))
将扩展为 abc.foldRight(0)(y => math.max(x => x.length, y))
.占位符语法在最近的一对右括号中展开,除非您只有下划线,在这种情况下,它将在最近的一对括号之外展开。
您可以使用 abc.foldRight(0)(_.length max _)
它没有这个缺点。
关于Scala 部分应用了柯里化(Currying)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9429216/