Haskell列表构造和内存使用情况

时间:2016-12-21 16:34:53

标签: haskell

假设我有以下代码:

a = reverse b
doSomething a

列表a的内存是否会被实际分配,或者doSomething只会重复使用列表b?如果要分配内存,有没有办法避免它?仅仅因为我需要一个反向列表而使内存使用率翻倍并不是特别好听。

1 个答案:

答案 0 :(得分:0)

在最坏的情况下,ab都将完整地存在于内存中。请注意,即使这样,两个列表中的内容也只存在一次,在两个列表之间共享,所以我们只讨论" spine"列表中存在两次。

在最好的情况下,根据b的定义方式以及doSomething的作用,编译器可能会做一些启发魔法,将整个事物转换为生成内容的紧密的常量空间循环列表处理它们时,可能根本不涉及内存分配。也许

但即使在最糟糕的情况下,你也会重复列表的主干。您永远不会复制列表中的实际元素

(每个cons节点是什么,3个指针?我认为......)