首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多态变体的内联记录?

多态变体的内联记录?
EN

Stack Overflow用户
提问于 2020-04-29 13:49:56
回答 1查看 292关注 0票数 5

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

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

我正在寻找多态变体:

代码语言:javascript
运行
复制
# 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

但这不起作用,所以现在我用一个显式的辅助记录类型来代替.据我现在所理解,这两者都需要更多的内存,而且速度更慢。

我也能用多态变体获得这个很酷的特性吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 14:15:53

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

代码语言:javascript
运行
复制
type t = A of int * int | B
let f = function
  | A (_,y) -> y
  | B -> 0

代码语言:javascript
运行
复制
type 'a t = A of 'a | B
let f = function
  | A (_,y) -> y
  | B -> 0

因此,可以优化第一个

代码语言:javascript
运行
复制
A (_,y) -> y

进入“访问块的第二个字段”,同时仍在编译第二个案例

代码语言:javascript
运行
复制
A (_,y) -> y

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

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61503391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档