Haskell列表的构造和内存使用

Haskell列表的构造和内存使用,haskell,Haskell,假设我有以下代码: a = reverse b doSomething a 列表a的内存是实际分配的,还是doSomething只是重用列表b?如果要分配内存,有没有办法避免?仅仅因为我需要一个颠倒的列表而将内存使用率加倍听起来并不特别好。在最坏的情况下,a和b都将全部存在于内存中。请注意,即使这样,两个列表的内容也只存在一次,在两个列表之间共享,因此我们只讨论存在两次的列表的“脊椎” 在最好的情况下,取决于b是如何定义的,以及doSomething做了什么,编译器可能会做一些奇怪的事情,将整

假设我有以下代码:

a = reverse b
doSomething a

列表
a
的内存是实际分配的,还是
doSomething
只是重用列表
b
?如果要分配内存,有没有办法避免?仅仅因为我需要一个颠倒的列表而将内存使用率加倍听起来并不特别好。

在最坏的情况下,
a
b
都将全部存在于内存中。请注意,即使这样,两个列表的内容也只存在一次,在两个列表之间共享,因此我们只讨论存在两次的列表的“脊椎”

在最好的情况下,取决于
b
是如何定义的,以及
doSomething
做了什么,编译器可能会做一些奇怪的事情,将整个事情变成一个紧凑的常量空间循环,在处理列表内容时生成列表内容,可能根本不涉及内存分配。也许吧

但即使在最坏的情况下,你也在复制列表的脊梁。您永远不会复制列表中的实际元素


(每个cons节点是,什么,3个指针?我想…

很难说。列表的脊椎可能最终会被复制——这很难评估,因为1)有许多优化可以避免这种情况,2)懒惰使得新列表一产生就可以使用,因此新脊椎实际上会消耗恒定的内存量。在任何情况下,列表的元素都不会重复(只有脊椎)。根据您的其他用例,您最好使用列表而不是列表。。。