【发布时间】:2016-04-18 14:26:25
【问题描述】:
在构建列表时,我通常使用右折叠,因为这样我可以使用右关联 : 运算符,而不会影响结果列表的顺序。在左折叠中,我可以使用++,但我知道这将需要在生成列表时重复复制列表,从而为 N 元素列表提供 O(N^2) 操作,这通常是不可接受的。
所以,当我必须使用左折叠时(在我的特定情况下,这是因为我使用 foldlM 并且产生的单子动作必须按从左到右的顺序执行),除了使用: 在折叠中构建列表并反转结果之外,还有什么更好的方法可以解决这个问题?
【问题讨论】:
-
在较新的版本中,
Data.Foldable.foldl被定义为foldr,以便与其他操作融合。reverse应该是其中之一,因此您应该只使用reverse $ foldl ...就可以得到一个非常高效的版本。至少我的猜测。 -
不,反向不参与列表融合。
标签: haskell functional-programming fold