如果我们应该避免在Haskell中使用foldl,我们是否应该避免基于它的所有帮助者?

时间:2014-03-07 09:33:27

标签: performance haskell fold

鉴于(?)foldl'始终优先于foldl,是否意味着最好避免使用基于maximum的{​​{1}}等帮助者?

是否应该使用类似foldl包的内容来获得有效的折叠,并且这应该成为foldl的常用知识吗?

2 个答案:

答案 0 :(得分:4)

我不会说foldl'foldl好。碰巧许多折叠的使用会导致结构变小,严格性对于避免过多的thunk创建有用,从而节省内存。

例如,如果您考虑foldl'的应用程序导致列表(例如foldl' (++) []),那么您仍然可以创建thunk,因为严格性不是deep

Prelude Data.List> null (foldl' (++) [] [[0], undefined]])
False

另一方面,如果折叠的结果是其输入的扩展,则使折叠严格会妨碍性能。所以在不同的情况下,不同的折叠函数是有用的。

答案 1 :(得分:4)

我认为这不是一个真正的问题,因为在实践中,程序是使用优化标志构建的,这使得严格性分析器和大多数简单的foldl在可能的情况下基本上成为foldl'。如果存在内存消耗和泄漏漏洞的实际问题,应通过分析检测和解决它们,而不是过早的建议。