8

foldが不変に対して定義される方法を見ていました。Set:

def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1 

ただし、foldLeftは次のように定義されます。

def foldLeft [B] (z: B)(op: (B, A) ⇒ B): B 

foldLeftと同じように、foldが返すコレクションのタイプを変更できることを期待していたので、これは少なくとも一見すると奇妙に見えます。

これは、foldLeftとfoldRightが、要素が折りたたまれる順序について何かを保証しているためだと思います。foldによって与えられる保証は何ですか?

4

2 に答える 2

10

適用するfoldLeft場合、開始値は最初のリスト要素と組み合わされます。結果は2番目のリスト要素と組み合わされます。この結果は3番目などになります。最終的に、リストは開始値と同じタイプの1つの要素に折りたたまれました。したがって、関数でリスト要素と組み合わせることができるタイプが必要です。同じことが当てはまりますが、逆の順序です
foldRight

fold組み合わせによる注文が行われることを保証するものではありません。また、1つの位置から開始することを保証するものではありません。折り目は並行して発生する可能性があります。並列処理を行うことができるため、2つのリスト要素または戻り値を組み合わせることができる必要があります。これにより、型に制約が追加されます。

大文字と小文字を区別する必要があるというコメントについては、次のような効果があります。折り畳みを使用して文字のリストを連結し、結果としてテキストを作成するとします。入力がの場合、 (たとえば)の代わりにA, B, C受信する順序を保持したい場合があります。 一方、たとえば、数字を合計するだけの場合は、順序は重要ではありません。合計すると、追加の順序とは無関係になります。このような場合、またはの代わりにを使用すると、実行が速くなる可能性があります。ABCACB
1, 2, 36foldfoldLeftfoldRight

于 2011-08-10T18:31:46.883 に答える
1

FoldLeftはBを返す必要があるようです。メソッドはBargを取ります-これはアキュムレータです。Aの値は、Bに「さらに追加」するために使用されます。最終的な累積値が返されます。この点で、FoldLeftとFoldRightは同じだと思います。

于 2011-08-09T21:37:00.830 に答える