【问题标题】:Scala partially applied curried functionsScala 部分应用了柯里化函数
【发布时间】:2012-03-14 19:30:09
【问题描述】:

为什么我不能重写

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)

【问题讨论】:

  • 使用两个 _ 编译器如何知道用哪个参数替换 a,b 中的第一个 _ 和第二个参数?

标签: scala currying


【解决方案1】:

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

你可以使用abc.foldRight(0)(_.length max _),它没有这个缺点。

【讨论】:

  • 谢谢!这个答案对我有帮助。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多