为什么foldBack的签名与F#中的fold折扣有很大不同?

时间:2013-09-29 04:32:31

标签: f#

我至少有两件事我不明白:

  • 从左侧折叠到右侧折叠需要进行大量更改,不仅在签名方面,而且在每个地方都需要依赖于文件夹功能
  • 无法在不翻转参数的情况下将其链接到列表

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

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

为什么有人会将foldBack的签名中的所有参数反向放入fold

2 个答案:

答案 0 :(得分:12)

这只是一个有用的助记符,可以帮助程序员记住列表的迭代方式。想象一下,您的列表的布局是左侧的开头和右侧的末尾。 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

答案 1 :(得分:5)

这是F#在OCaml开始的遗物。您可以看到List.foldList.foldBack的F#函数签名在the OCaml documentation中相同(分别称为List.fold_leftList.fold_right。) / p>