Haskell 中的一些基本列表操作(例如 ghc)是否与它们的命令式对应项进行了等效优化?
例如,如果我有一些有限但在运行时列表中计算,它的长度是否附加到这个列表或评估函数(长度 xs)必须递归遍历整个列表?
编译器是否有一些常见的 Haskell(ghci 或一般)优化列表?
最佳答案
Haskell 非常擅长对列表进行优化,但不是你描述的类型。 Haskell 没有对列表进行“特殊”处理——它们就像其他普通的 Haskell 类型一样,尽管有一些内置的语法糖。没什么特别的
data List a = Nil | Cons a (List a)
将是。
Haskell 使用所谓的 foldr/build fusion 来优化列表,例如优化
map f (filter p list)
这样它就不会为 filter
生成中间列表,但在同一次遍历中同时执行 map 和过滤器。见 here有关“ fuse ”的详细信息,或阅读 here有关其工作原理的更多详细信息。此外,Haskell 更现代的数组库使用了更激进的融合类型,例如 fuse
sum (map f (enumFromN 0 n))
从 0
到尾递归迭代至 n-1
,这基本上正是您想要的。调查vector package , this blog post流融合可以做什么,以及 this paper详情。
关于optimization - Haskell 中的基本列表操作优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9759745/