OCaml中无穷无尽的名单会占用所有的记忆吗?

时间:2014-04-24 10:39:41

标签: ocaml

我们可以构建一个这样的无穷无尽的列表:

let rec endless = 1::endless

我认为它会占用所有的记忆,但当我尝试utop时,它似乎并非如此。

utop显示已构建列表:

  

val endless:int list =
  [1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;   1; 1; 1; 1; 1; 1; 1; ...]

当我尝试应用List.length时,它当然永远不会停止,因为它具有无限数量的1 s。


问:

  1. OCaml如何处理无尽的列表?

  2. 为什么它不会出现内存不足的错误?

2 个答案:

答案 0 :(得分:9)

在OCaml中,列表为single linked lists。您的endless在内存中表示为自递归cons单元

.--------.
|        | 
|  +---+-|-+
`->| 1 | * |
   +---+---+

答案 1 :(得分:5)

我不了解OCaml,所以我无法告诉你OCaml如何处理实现,但我可以给你一个大概的想法。

从理论上看,你可以拥有一个只有一个元素的无穷无尽的列表,指向自己作为下一个和上一个节点。这只是数据结构设计的问题。 因此,存储无限列表所需的内存将归结为一个元素和两个指针,两者都指向同一元素。

因此它几乎不使用任何内存,但是不可能通过遵循下一个/上一个指针来计算导航列表节点的算法。