1. ホーム
  2. f#

[解決済み] foldとreduceの違い?

2022-07-11 13:51:22

質問

F#を学ぼうとしているが、以下のような区別をしようとすると混乱する。 折り畳み 減らす . Fold は 同じこと を行いますが、余分なパラメータを取ります。この2つの関数が存在する正当な理由があるのでしょうか、それとも異なる背景を持つ人々を収容するために存在するのでしょうか?(例: C# の String と string)

以下はサンプルからコピーしたコードスニペットです。

let sumAList list =
    List.reduce (fun acc elem -> acc + elem) list

let sumAFoldingList list =
    List.fold (fun acc elem -> acc + elem) 0 list

printfn "Are these two the same? %A " 
             (sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])

どのように解決するのですか?

Fold はアキュムレータの初期値を明示的に取りますが reduce は入力リストの最初の要素をアキュムレータの初期値として使用します。

これは、アキュムレータとその結果の型がリスト要素の型と一致しなければならないことを意味します。 fold ではアキュムレータが別個に提供されるため、異なる場合があります。これはタイプに反映されます。

List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State
List.reduce : ('T -> 'T -> 'T) -> 'T list -> 'T

さらに reduce は空の入力リストに対して例外を投げます。