OCaml中变体的内存表示

时间:2014-06-11 12:05:22

标签: ocaml

对于没有参数的变体,它们只是存储为OCaml整数而不进行装箱,整数按升序在一种类型中。

例如,让我们定义一个函数peek来查看变量的实数整数值:

let peek x = ((Obj.magic (Obj.repr x)):int);;

我定义了一个类型:

type t1 = Apple | Orange;;

然后peek Apple;;将返回0peek Orange;;将返回1

但是,如果我定义第二种类型

type t2 = Empty | Node;;

然后再次peek Empty;;0返回1peek Node


基本上,变体的整数增量不是全局的。

我有问题:

  1. 由于OCaml在运行期间不会维护类型信息,运行时如何知道整数是普通整数还是没有参数的变量?

  2. 此外,OCaml运行时如何说明实际属于不同类型的两个变体之间的差异?例如,它如何区分 Apple Empty 之间的差异,因为它们都是0?

1 个答案:

答案 0 :(得分:4)

运行时无法区分0AppleEmpty,但它并不需要。编译器会检查类型,以便Apple始终与t1类型一起使用,而不是t2int。一旦编译器检查了类型,就不再需要它们了,因为你确定(你有证明),具有0含义的整数Apple永远不会被用于另一个含义。