我至少有两件事我不明白:
List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State
List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State
为什么有人会将foldBack
的签名中的所有参数反向放入fold
?
答案 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.fold
和List.foldBack
的F#函数签名在the OCaml documentation中相同(分别称为List.fold_left
和List.fold_right
。) / p>