11

至少有两件事我不明白:

  • 从左侧折叠到右侧折叠的重构需要大量更改,不仅在签名方面,而且在每个地方都取决于文件夹功能
  • 如果不翻转参数,就无法将其链接到列表

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相反,它从右侧的初始状态开始,然后返回左侧的列表。

这无疑展示了 F# 的 OCaml 遗产,因为其他一些函数式语言(Haskell、Scala、ML)将列表作为最后一个参数,以允许更常见的部分应用场景。

如果我真的需要一个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

它是 F# 在 OCaml 中的开端。您可以在OCaml 文档中看到 和 的 F# 函数签名List.fold相同List.foldBack(分别称为和)。List.fold_leftList.fold_right

于 2013-09-29T18:51:25.673 回答