OCaml中变量的内存表示

OCaml中变量的内存表示,ocaml,Ocaml,对于没有参数的变量,它们只存储为一个OCaml整数而不装箱,并且整数在一个类型中按升序 例如,让我们定义一个函数peek,以查看变量的实际整数值: let peek x = ((Obj.magic (Obj.repr x)):int);; 我定义了一种类型: type t1 = Apple | Orange;; 然后peek Apple将返回0和peek橙色将返回1 但是,如果我定义第二种类型 type t2 = Empty | Node;; 然后再次peek Empty将返回0和1 基

对于没有参数的变量,它们只存储为一个OCaml整数而不装箱,并且整数在一个类型中按升序

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

let peek x = ((Obj.magic (Obj.repr x)):int);;
我定义了一种类型:

type t1 = Apple | Orange;;
然后
peek Apple
将返回
0
peek橙色
将返回
1

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

type t2 = Empty | Node;;
然后再次
peek Emptypeek节点
,code>将返回
0
1


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

我有以下问题:

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

  • 此外,OCaml运行时如何区分实际上属于不同类型的两个变体之间的差异?e、 例如,苹果和空苹果都是0,它如何分辨它们之间的差异呢


  • 运行时无法区分
    0
    Apple
    Empty
    ,但它不需要区分。编译器检查类型,以便
    Apple
    始终与类型
    t1
    一起使用,而不是
    t2
    int
    。一旦编译器检查了这些类型,您就不再需要它们了,因为您确信(您有证据证明)具有
    Apple
    含义的整数
    0
    永远不会与其他含义一起使用。

    运行时无法区分
    0
    Apple
    Empty
    但它不需要。编译器检查类型,以便
    Apple
    始终与类型
    t1
    一起使用,而不是
    t2
    int
    。一旦编译器检查了这些类型,您就不再需要它们了,因为您确信(您有证据证明)具有
    Apple
    with含义的整数
    0
    永远不会与其他含义一起使用。

    您将看到异常、打开类型、,和多态变体是不同的。@nlucaroni您所说的
    开放类型
    是什么意思?ocaml 4.02中新增的--您将看到异常、开放类型和多态变体是不同的。@nlucaroni您所说的
    开放类型
    是什么意思?ocaml 4.02中新增的--