Ocaml 多态变体中的内联记录?

Ocaml 多态变体中的内联记录?,ocaml,performance,missing-features,Ocaml,Performance,Missing Features,手册第8章“语言扩展”描述了: 现在可以使用与记录相同的语法定义sum类型构造函数的参数。允许使用可变字段和多态字段。支持GADT语法。可以在各个字段上指定属性。[……] 我正在寻找多态变体: # type a = B of {x:int; mutable y:int} ;; type a = B of { x : int; mutable y : int; } # type b = `A of {u:int; mutable v:int} ;; Line 1, characters 9-10:

手册第8章“语言扩展”描述了:

现在可以使用与记录相同的语法定义sum类型构造函数的参数。允许使用可变字段和多态字段。支持GADT语法。可以在各个字段上指定属性。[……]

我正在寻找多态变体:

# type a = B of {x:int; mutable y:int} ;;
type a = B of { x : int; mutable y : int; }
# type b = `A of {u:int; mutable v:int} ;;
Line 1, characters 9-10:
Error: Syntax error
但这不起作用,所以现在我使用一个显式的辅助记录类型来代替。。。 正如我现在所理解的,这既占用了更多的内存,也有点慢


我也可以通过多态变量获得这个很酷的功能吗?

对于普通构造函数,编译器可以使用类型定义来区分:

类型t=A/int*int | B
设f=函数
|A(u,y)->y
|B->0

类型'a t=a/a'a | B
设f=函数
|A(u,y)->y
|B->0
因此,可以优化第一种方法

A (_,y) -> y
进入“访问块的第二个字段,同时仍编译第二个大小写”

A (_,y) -> y
“访问块的第一个字段中的元组,然后访问块的第二个字段”

对于多态变量,不可能依靠不存在的类型定义来区分这两种解决方案。因此,它们的内存表示必须是一致的。这意味着多态变量始终具有一个参数,并且在只有on时标记构造函数的每个参数并不是真正有用的e论点

这就是内联记录不能与多态变体组合的原因