Alexander Tumin
Alexander Tumin

Reputation: 645

Scala partially applied curried functions

Why can't i rewrite

println(abc.foldRight(0)((a,b) => math.max(a.length,b)))

in

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)))
  }
}

to

println(abc.foldRight(0)(math.max(_.length,_)))

? scala interpreter yields

/path/to/Main.scala:4: error: wrong number of parameters; expected = 2
    println(abc.foldRight(0)(math.max(_.length,_)))
                                     ^
one error found

Which is not descriptive enough for me. Isn't resulting lambda takes two parameters one of which being called for .length method, as in abc.map(_.length)?

Upvotes: 5

Views: 339

Answers (1)

missingfaktor
missingfaktor

Reputation: 92106

abc.foldRight(0)(math.max(_.length, _)) will expand to something like abc.foldRight(0)(y => math.max(x => x.length, y)). The placeholder syntax expands in the nearest pair of closing parentheses, except when you have only the underscore in which case it will expand outside the closest pair of parentheses.

You can use abc.foldRight(0)(_.length max _) which doesn't suffer from this drawback.

Upvotes: 9

Related Questions