4

手册第8 章“语言扩展”描述了“内联记录”(8.17)

现在可以使用与记录相同的语法来定义 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

但这不起作用,所以现在我使用显式辅助记录类型来代替......据我所知,这既需要更多内存,又有点慢。

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

4

1 回答 1

7

在普通构造函数的情况下,编译器可以通过类型定义来区分:

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

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

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

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

于 2020-04-29T14:15:53.443 回答