对于没有参数的变体,它们只是存储为OCaml整数而不进行装箱,整数按升序在一种类型中。
例如,让我们定义一个函数peek
来查看变量的实数整数值:
let peek x = ((Obj.magic (Obj.repr x)):int);;
我定义了一个类型:
type t1 = Apple | Orange;;
然后peek Apple;;
将返回0
,peek Orange;;
将返回1
。
但是,如果我定义第二种类型
type t2 = Empty | Node;;
然后再次peek Empty;;
将0
返回1
和peek Node
。
基本上,变体的整数增量不是全局的。
我有问题:
由于OCaml在运行期间不会维护类型信息,运行时如何知道整数是普通整数还是没有参数的变量?
此外,OCaml运行时如何说明实际属于不同类型的两个变体之间的差异?例如,它如何区分 Apple 和 Empty 之间的差异,因为它们都是0?
答案 0 :(得分:4)
运行时无法区分0
,Apple
和Empty
,但它并不需要。编译器会检查类型,以便Apple
始终与t1
类型一起使用,而不是t2
或int
。一旦编译器检查了类型,就不再需要它们了,因为你确定(你有证明),具有0
含义的整数Apple
永远不会被用于另一个含义。