鉴于(?)foldl'
始终优先于foldl
,是否意味着最好避免使用基于maximum
的{{1}}等帮助者?
是否应该使用类似foldl包的内容来获得有效的折叠,并且这应该成为foldl
的常用知识吗?
答案 0 :(得分:4)
我不会说foldl'
比foldl
好。碰巧许多折叠的使用会导致结构变小,严格性对于避免过多的thunk创建有用,从而节省内存。
例如,如果您考虑foldl'
的应用程序导致列表(例如foldl' (++) []
),那么您仍然可以创建thunk,因为严格性不是deep
Prelude Data.List> null (foldl' (++) [] [[0], undefined]])
False
另一方面,如果折叠的结果是其输入的扩展,则使折叠严格会妨碍性能。所以在不同的情况下,不同的折叠函数是有用的。
答案 1 :(得分:4)
我认为这不是一个真正的问题,因为在实践中,程序是使用优化标志构建的,这使得严格性分析器和大多数简单的foldl
在可能的情况下基本上成为foldl'
。如果存在内存消耗和泄漏漏洞的实际问题,应通过分析检测和解决它们,而不是过早的建议。