多态变体中的内联记录?
Inline records in polymorphic variants?
ocaml manual chapter 8 "language extensions" describes "inline records" (8.17):
The arguments of sum-type constructors can now be defined using the same syntax as records. Mutable and polymorphic fields are allowed. GADT syntax is supported. Attributes can be specified on individual fields. [...]
我正在寻找具有多态变体的那个:
# 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
但这不起作用,所以现在我改用显式辅助记录类型...
据我现在的理解,这既需要更多的内存,也有点慢。
我也可以通过多态变体获得这个很酷的功能吗?
在普通构造函数的情况下,编译器可以使用类型定义来区分:
type t = A of int * int | B
let f = function
| A (_,y) -> y
| B -> 0
和
type 'a t = A of 'a | B
let f = function
| A (_,y) -> y
| B -> 0
因此,可以优化第一个
A (_,y) -> y
进入“访问块的第二个字段”,同时仍在编译第二种情况
A (_,y) -> y
至"access the tuple in the first field of the block, and then access the second field of the block"。
对于多态变体,不可能依靠不存在的类型定义来区分这两种解决方案。因此,它们的内存表示必须是统一的。这意味着多态变体总是接受一个参数,当只有一个参数时,标记构造函数的每个参数并不是很有用。
这就是内联记录不能与多态变体组合的原因。
ocaml manual chapter 8 "language extensions" describes "inline records" (8.17):
The arguments of sum-type constructors can now be defined using the same syntax as records. Mutable and polymorphic fields are allowed. GADT syntax is supported. Attributes can be specified on individual fields. [...]
我正在寻找具有多态变体的那个:
# 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
但这不起作用,所以现在我改用显式辅助记录类型... 据我现在的理解,这既需要更多的内存,也有点慢。
我也可以通过多态变体获得这个很酷的功能吗?
在普通构造函数的情况下,编译器可以使用类型定义来区分:
type t = A of int * int | B
let f = function
| A (_,y) -> y
| B -> 0
和
type 'a t = A of 'a | B
let f = function
| A (_,y) -> y
| B -> 0
因此,可以优化第一个
A (_,y) -> y
进入“访问块的第二个字段”,同时仍在编译第二种情况
A (_,y) -> y
至"access the tuple in the first field of the block, and then access the second field of the block"。
对于多态变体,不可能依靠不存在的类型定义来区分这两种解决方案。因此,它们的内存表示必须是统一的。这意味着多态变体总是接受一个参数,当只有一个参数时,标记构造函数的每个参数并不是很有用。
这就是内联记录不能与多态变体组合的原因。