内联记录是否包含多态变体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内联记录是否包含多态变体?相关的知识,希望对你有一定的参考价值。

手册第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

“访问块的第一个字段中的元组,然后访问块的第二个字段”。

对于多态变体,不可能依靠不存在的类型定义来区分这两种解决方案。因此,它们的内存表示必须统一。这意味着多态变体总是带有一个参数,并且当只有一个参数时,标记构造函数的每个参数并没有什么用。

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

以上是关于内联记录是否包含多态变体?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi - 带有变体部分的记录

Oracle:是不是有支持内联代码的 REGEX_REPLACE 变体?

有没有办法在 ReasonML 中获取多态变体的标签作为变量

包含私有调用的Java内联方法

构造一个包含变体类型索引中第 n 个类型值的 boost 变体?

包含自身映射的 C++ 变体