OCaml中变量的内存表示
对于没有参数的变量,它们只存储为一个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 基
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对于peek节点
,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中新增的--