2

次の Scala コード サンプルがありますが、foldLeft ではエラーが発生するのに、foldRight ではエラーが発生する理由を知りたいですか?

val xs = List(1,2,3) 
val ys = List(4,5,6)
(xs foldLeft ys) (_::_) // Error: Value :: is not a member of Int
(xs foldRight ys) (_::_) // Res: List(1, 2, 3, 4, 5, 6)

私は Scala を初めて使用するので、できるだけ簡単に返信してください。ありがとう

4

3 に答える 3

2

つまり、操作 '::' は Int では使用できず、コレクションでのみ使用できます。Scala REPL で'(xs foldLeft ys) _'を実行すると、関数になることがわかります

((List[Int], Int) => List[Int]) => List[Int] = <function1>

したがって、最初のオペランドは List[Int] で、2 番目のオペランドは Int です。':' で終わる演算子は特殊であることに注意してください。これは、左側のオペランドを引数として使用して右側のオペランドで操作されるためです。これは「右結合」と呼ばれますが、デフォルトは通常「左結合」です。

したがって、'aList :: anInt' は 'anInt.::(aList)' に変換され、Int には '::' メソッドがないため、これにより問題が発生します。

「foldLeft」の場合、「:+」のような単一の要素を追加するには、左結合関数が必要です。したがって、これは機能します:

(xs foldLeft ys)(_ :+ _)

結果は foldRight とはかなり異なるため、状況に応じて正しいものを選択してください。

于 2015-07-07T08:58:58.533 に答える