OCaml编译器如何处理这段代码?

OCaml编译器如何处理这段代码?,ocaml,ocamlbuild,Ocaml,Ocamlbuild,我阅读了一个用OCaml编写的项目,但在这里找不到一些源代码: type 'a node = {mutable parent: 'a node; mutable rank: int; label: 'a} let singleton x = let rec n = {parent=n; rank=0; label=x} in n 这段代码是不相交集的一部分,但我并不真正理解Recrive函数。我曾经是一个C++程序员,可以很容易地使用一个指针来处理父对象。br> 当我在OCam

我阅读了一个用OCaml编写的项目,但在这里找不到一些源代码:

type 'a node = {mutable parent: 'a node; mutable rank: int; label: 'a}

let singleton x = 
     let rec n = {parent=n; rank=0; label=x} in
 n
这段代码是不相交集的一部分,但我并不真正理解Recrive函数。我曾经是一个C++程序员,可以很容易地使用一个指针来处理父对象。br> 当我在OCaml utop中运行此代码时,结果令我惊讶。它确实生成了许多节点。
由于生成了这么多节点,这段代码会占用大量内存吗?

编译器如何在没有溢出的情况下处理此问题?

它不会创建多个节点,而是创建一个节点

在内部,节点的值表示为指针,因此
n
在其父字段中有一个指向自身的指针。这就像是用C++中的指针创建一个循环数据结构的方式。C++总是需要分配来创建循环,但是在OCAM中,可以通过递归创建一些简单的循环。
在utop中,您可以看到一个值
n
被多次打印。OCaml值打印机以展开形式打印值,即使其中有循环。

顺便说一句,这看起来像一个不相交的集合数据结构。您的
main
代码在哪里?我使用主< <代码>以适应C++的范例。当然,ocaml没有特定的
main
。事实上:(1)“一些简单的循环”意味着在文本上放入程序的节点上循环——但这是没有惰性的;(2) 惰性是通过递归创建任意循环的“可变性”的充分形式。