Scala частично примененные функции карри - PullRequest
5 голосов
/ 24 февраля 2012

Почему я не могу переписать

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

Что не достаточно описательно для меня. Разве в результате лямбда принимает два параметра, один из которых вызывается для метода .length, как в abc.map(_.length)?

1 Ответ

9 голосов
/ 24 февраля 2012

abc.foldRight(0)(math.max(_.length, _)) расширится до чего-то вроде abc.foldRight(0)(y => math.max(x => x.length, y)). Синтаксис заполнителя расширяется в ближайшей паре закрывающих скобок, за исключением случаев, когда у вас есть только подчеркивание, и в этом случае он будет расширяться за пределы ближайшей пары скобок.

Вы можете использовать abc.foldRight(0)(_.length max _), который не страдает от этого недостатка.

...