11

それについて私が理解していないことが少なくとも2つあります。

  • 左側から右側へのリファクタリング 折りたたみには、署名だけでなく、フォルダー機能に依存するすべての場所で多くの変更が必要です
  • パラメータを反転せずにリストに関してチェーンする方法はありません

List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State

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

foldBack比較対象の署名で、誰かがすべてのパラメータを逆に配置する正当な理由はありますfoldか?

4

2 に答える 2

16

これは、リストがどのように繰り返されるかをプログラマーが覚えておくのに役立つニーモニックです。リストが左側に始まり、右側に終わりがあるようにレイアウトされていると想像してください。fold左の初期状態から始まり、右に向かって状態を蓄積します。foldBack逆に、右側の初期状態から開始し、左側のリストに戻ります。

他の関数型言語 (Haskell、Scala、ML) は、より一般的な部分適用シナリオを可能にする最後の引数としてリストを保持しているため、これは間違いなく F# の OCaml の遺産を示しています。

foldBackとまったく同じバージョンの が本当に必要な場合はfold、独自のヘルパー関数を定義します。

module List = 
  let foldBack' f acc lst =
    let flip f a b = f b a
    List.foldBack (flip f) lst acc
于 2013-09-29T05:09:29.030 に答える
5

これは、OCaml における F# の始まりの遺物です。List.foldと の F# 関数シグネチャは、OCaml ドキュメントList.foldBackで同じであることがわかります (それぞれと と呼ばれています)。List.fold_leftList.fold_right

于 2013-09-29T18:51:25.673 に答える