我们可以构建一个这样的无穷无尽的列表:
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。
问:
OCaml如何处理无尽的列表?
为什么它不会出现内存不足的错误?
答案 0 :(得分:9)
在OCaml中,列表为single linked lists。您的endless
在内存中表示为自递归cons单元
.--------.
| |
| +---+-|-+
`->| 1 | * |
+---+---+
答案 1 :(得分:5)
我不了解OCaml,所以我无法告诉你OCaml如何处理实现,但我可以给你一个大概的想法。
从理论上看,你可以拥有一个只有一个元素的无穷无尽的列表,指向自己作为下一个和上一个节点。这只是数据结构设计的问题。 因此,存储无限列表所需的内存将归结为一个元素和两个指针,两者都指向同一元素。
因此它几乎不使用任何内存,但是不可能通过遵循下一个/上一个指针来计算导航列表节点的算法。