通常,foldl
可以避免使用foldl'
或foldr
。引用Real World Haskell:
由于foldl的thunking行为,避免这种情况是明智的 实际程序中的功能:即使它没有完全失败,它也会 不必要的低效率。相反,导入Data.List并使用 与foldl”。
答案 0 :(得分:13)
Prelude是在foldl'
存在之前设计的,从那时起,就一直存在向后兼容性(关于严格性,如你所提到的)的压力。
答案 1 :(得分:10)
对于(\\)
和unionBy
,折叠函数的类型为
foo :: [a] -> b -> [a]
和foo xs y
最多删除xs
中的一个元素,因此使用foldl'
一般不会购买任何内容,所以thunk将建在最顶层{{1}的右侧而不是在它之上。
就严格性而言,它没有什么区别,据我所知,只有当结果需要被评估为弱头正常形式时才会评估两个折叠,并且每当(:)
产生一个foldl'
,_|_
也是如此。
答案 2 :(得分:4)
在这两种情况下,累加器都是[a]
类型。我不能看到强迫列表变为弱头正常形式会产生巨大的差异,引入这种局部严格似乎有点武断。