2012-02-24 22 views
5

Perché non posso riscriverefunzioni curry Scala parzialmente applicate

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

a

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

? scala rese interprete

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

che non è abbastanza descrittivo per me. Non risulta che lambda prende due parametri uno dei quali viene chiamato per il metodo .length, come in abc.map(_.length)?

+0

Utilizzando due _ come sarà il compilatore a sapere quale parametro sostituire con il primo _ e il secondo da a, b? –

+0

Repsectivly, penso –

risposta

9

abc.foldRight(0)(math.max(_.length, _)) si espanderà a qualcosa come abc.foldRight(0)(y => math.max(x => x.length, y)). La sintassi del segnaposto si espande nella coppia più vicina di parentesi di chiusura, tranne quando si ha solo il carattere di sottolineatura, nel qual caso si espanderà al di fuori della coppia di parentesi più vicina.

È possibile utilizzare abc.foldRight(0)(_.length max _) che non soffre di questo inconveniente.

+0

Grazie! Questa risposta mi ha aiutato. –