Scala部分应用了curried函数

时间:2012-02-24 10:32:06

标签: scala currying

为什么我不能重写

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)

1 个答案:

答案 0 :(得分:9)

abc.foldRight(0)(math.max(_.length, _))将扩展为类似abc.foldRight(0)(y => math.max(x => x.length, y))的内容。占位符语法在最近的一对右括号中展开,除非您只有下划线,在这种情况下,它将扩展到最近的括号对之外。

您可以使用没有此缺点的abc.foldRight(0)(_.length max _)