Haskell中的基本列表操作优化

Tri*_*tos 4 optimization haskell

Haskell中的一些基本列表操作(例如ghc)是否与其命令式对应项等效地进行了优化?

例如,如果我有一些有限但计算在运行时列表中的长度是附加到此列表还是评估函数(长度xs)必须递归遍历整个列表?

是否有一些编译器通用的Haskell(ghci或一般)优化列表?

Lou*_*man 8

Haskell非常擅长对列表进行优化,但不是您描述的类型.Haskell对列表没有"特殊"处理 - 它们就像其他普通的Haskell类型一样,虽然有一些内置的语法糖.没什么特别的

data List a = Nil | Cons a (List a)
Run Code Online (Sandbox Code Playgroud)

将会.

Haskell使用所谓的foldr/build fusion来优化列表,例如map f (filter p list),它会优化,以便它不会产生中间列表filter,但同时遍历地图和过滤器.有关"保险丝"的详细信息,请参见此处,或阅读此处了解有关其工作原理的更多详细信息.

此外,Haskell的更现代的阵列库使用更激进类型的融合,可以例如保险丝sum (map f (enumFromN 0 n))到尾递归迭代自0n-1,这基本上是你想要什么.调查矢量包,这个博客文章可以进行流融合,以及本文的详细信息.