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

ami*_*dfv 8 haskell built-in

一般来说,foldl避免赞成foldl'foldr.引用真实世界Haskell:

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

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

Dan*_*ner 13

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


Dan*_*her 10

在的情况下(\\)unionBy,折叠函数具有类型

foo :: [a] -> b -> [a]
Run Code Online (Sandbox Code Playgroud)

foo xs y删除最多一个元素xs,所以使用foldl'一般不会购买任何东西,thunk将建立在最顶部的右侧,(:)而不是在它上面.

在严格性方面它没有什么区别,据我所知,只有当结果需要被评估为弱头正常形式时才会评估两个折叠,并且无论什么时候foldl'产生a _|_,都会如此foldl.