2012-02-24 14 views
5

のはなぜScalaの部分的に適用カリー機能

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

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)((a,b) => math.max(a.length,b))) 

を書き換えることができませんか? scala通訳者数

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

私には説明が不十分です。ラムダはabc.map(_.length)のように.lengthメソッドの1つが2つのパラメータを取ります。

+0

コンパイラは、2つの_をどのように使用して、a、bの最初の_と2番目のものを代入するかを知りますか? –

+0

Repsectivly、私は考えます –

答えて

9

abc.foldRight(0)(math.max(_.length, _))は、abc.foldRight(0)(y => math.max(x => x.length, y))のような形式に展開されます。プレースホルダー構文は、閉じ括弧の最も近いペアで展開されますが、アンダースコアのみの場合を除き、最も近いペアの括弧の外側に展開されます。

この欠点のないabc.foldRight(0)(_.length max _)を使用できます。

+0

ありがとう!この回答は私を助けました。 –

関連する問題