至少有两件事我不明白:
- 从左侧折叠到右侧折叠的重构不仅需要在签名上进行大量更改,而且在每个地方都需要进行大量更改,具体取决于文件夹功能
- 没有办法在不翻转参数的情况下将其链接到列表
List.foldBack : ('T -> 'State -> 'State) -> 'T list -> 'State -> 'State
List.fold : ('State -> 'T -> 'State) -> 'State -> 'T list -> 'State
为什么有人会将所有参数反向放在签名中的任何充分理由foldBack
相比fold
?
它只是一个有用的助记符,可以帮助程序员记住列表是如何迭代的。想象一下,您的列表的开头在左侧,结尾在右侧。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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)