1

我读了一个用 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

这段代码是不相交集的一部分,但我不太了解递归函数。我曾经是一名 C++ 程序员,可以轻松地使用指针来处理事物。
当我在 OCaml utop 中运行这段代码时,结果让我大吃一惊。它确实生成了许多节点。
由于生成了这么多节点,此代码是否会占用大量内存?编译器如何在不溢出
的情况下处理这个问题?

4

1 回答 1

3

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

在内部,节点的值表示为一个指针,因此n在其父字段中也有一个指向自身的指针。这很像在 C++ 中使用指针创建循环数据结构的一种方式。C++ 总是需要赋值来创建循环,但在 OCaml 中,一些简单的循环可以通过递归来创建。

在 utop 中,您会看到一个值n被多次打印。OCaml 值打印机以扩展形式打印值,即使其中有循环。

于 2013-12-13T02:16:58.057 回答