OCaml中无休止的列表会耗尽所有内存吗?

OCaml中无休止的列表会耗尽所有内存吗?,ocaml,Ocaml,我们可以这样构建一个无休止的列表: let rec endless = 1::endless 我想它会消耗掉所有的内存,但当我尝试使用utop时,它似乎不是这样 utop显示已构建的列表: val: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

我们可以这样构建一个无休止的列表:

let rec endless = 1::endless
我想它会消耗掉所有的内存,但当我尝试使用
utop
时,它似乎不是这样

utop
显示已构建的列表:

val: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;1;…]

当然,当我尝试应用
List.length
时,它从未停止过,因为它有无限多的
1
s


Q:

  • OCaml如何处理无休止的列表

  • 为什么它不会出现内存不足错误


  • 我不了解OCaml,所以我不能告诉您OCaml是如何处理实现的,但我可以给您一个大概的想法

    从理论上看,您可以有一个无休止的列表,其中只有一个元素,指向自身作为下一个和上一个节点。这只是数据结构设计的问题。 因此,存储无限列表所需的内存将归结为一个元素和两个指针,它们都指向同一个元素

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

    在OCaml中,列表是可用的。您的
    无休止的
    在内存中表示为一个自递归的cons单元

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

    是的,它是作为一个单链表实现的;以前没有保存函数副本的指针。您硬键入了图表?@JacksonTale是的,但今天没有:)我已经玩过递归列表,所以它是从中复制粘贴的