为什么有些Prelude函数是根据foldl定义的?

时间:2012-11-20 14:06:06

标签: built-in haskell

通常,foldl可以避免使用foldl'foldr。引用Real World Haskell

  

由于foldl的thunking行为,避免这种情况是明智的   实际程序中的功能:即使它没有完全失败,它也会   不必要的低效率。相反,导入Data.List并使用   与foldl”。

然而,一些Prelude函数是根据它来定义的(例如(\\)unionBy)。为什么是这样?是不是对这些功能不太严格?

3 个答案:

答案 0 :(得分:13)

Prelude是在foldl'存在之前设计的,从那时起,就一直存在向后兼容性(关于严格性,如你所提到的)的压力。

答案 1 :(得分:10)

对于(\\)unionBy,折叠函数的类型为

foo :: [a] -> b -> [a]

foo xs y最多删除xs中的一个元素,因此使用foldl'一般不会购买任何内容,所以thunk将建在最顶层{{1}的右侧而不是在它之上。

就严格性而言,它没有什么区别,据我所知,只有当结果需要被评估为弱头正常形式时才会评估两个折叠,并且每当(:)产生一个foldl'_|_也是如此。

答案 2 :(得分:4)

在这两种情况下,累加器都是[a]类型。我不能看到强迫列表变为弱头正常形式会产生巨大的差异,引入这种局部严格似乎有点武断。