OCaml编译器如何处理这段代码?
我阅读了一个用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
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
代码在哪里?我使用main
。事实上:(1)“一些简单的循环”意味着在文本上放入程序的节点上循环——但这是没有惰性的;(2) 惰性是通过递归创建任意循环的“可变性”的充分形式。