2012-02-24 126 views
5

爲什麼我不能改寫Scala的部分應用咖喱功能

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)

+0

使用兩個_將如何知道哪個參數替換第一個_和第二個來自a,b? – 2012-02-24 10:57:53

+0

Repsectivly,我認爲 – 2012-02-24 11:08:08

回答

9

abc.foldRight(0)(math.max(_.length, _))將展開爲類似abc.foldRight(0)(y => math.max(x => x.length, y))的東西。佔位符語法擴展爲最接近的一對右括號,除非只有下劃線,否則它將擴展到最接近的一對括號之外。

您可以使用abc.foldRight(0)(_.length max _)這不會受到這個缺點。

+0

謝謝!這個答案幫了我。 – 2012-02-24 11:08:41