我读了一个用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中运行此代码时,结果让我感到惊讶。它确实产生了许多节点
这段代码是否会产生大量内存,因为它产生了如此多的节点?
如果没有溢出,编译器如何处理这个问题?
答案 0 :(得分:3)
它不会创建多个节点,只有一个节点。
在内部,节点的值表示为指针,因此n
有一个指针,指向其父字段中的自身。这非常类似于使用C ++中的指针创建循环数据结构的方式。 C ++总是需要赋值来创建循环,但在OCaml中,可以通过递归创建一些简单的循环。
在utop中,您会看到多次打印一个值n
。 OCaml值打印机以扩展形式打印值,即使它们内部存在循环。