内联记录是否包含多态变体?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内联记录是否包含多态变体?相关的知识,希望对你有一定的参考价值。
ocaml手册第8章“语言扩展”介绍了"inline records" (8.17):
sum-type构造函数的参数现在可以使用与记录相同的语法进行定义。允许使用可变字段和多态字段。支持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
但是那不起作用,所以现在我改用显式辅助记录类型...据我了解,这既占用更多内存,又速度稍慢。
我也可以通过多态变体获得这个很酷的功能吗?
答案
在普通构造函数的情况下,编译器可以使用类型定义来区分:
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
“访问块的第一个字段中的元组,然后访问块的第二个字段”。
对于多态变体,不可能依靠不存在的类型定义来区分这两种解决方案。因此,它们的内存表示必须统一。这意味着多态变体总是带有一个参数,并且当只有一个参数时,标记构造函数的每个参数并没有什么用。
这就是为什么内联记录不能与多态变体组合的原因。
以上是关于内联记录是否包含多态变体?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:是不是有支持内联代码的 REGEX_REPLACE 变体?
有没有办法在 ReasonML 中获取多态变体的标签作为变量