OCaml编译器如何处理此代码?

时间:2013-12-13 01:04:53

标签: 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

此代码是不相交集的一部分,但我并不真正理解这个反复函数。我曾经是一名C ++程序员,可以轻松使用指针处理事物。
当我在OCaml utop中运行此代码时,结果让我感到惊讶。它确实产生了许多节点 这段代码是否会产生大量内存,因为它产生了如此多的节点? 如果没有溢出,编译器如何处理这个问题?

1 个答案:

答案 0 :(得分:3)

它不会创建多个节点,只有一个节点。

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

在utop中,您会看到多次打印一个值n。 OCaml值打印机以扩展形式打印值,即使它们内部存在循环。