【发布时间】:2016-08-11 08:52:07
【问题描述】:
在datatype 声明中,如果所有变体的所有类型参数本身都是eqtypes,标准ML 将产生一个相等类型。
我在一些地方看到 cmets 感叹用户无法提供自己的平等定义并构建自己的 eqtypes 以及 SML 规则的意外后果(例如,bare refs 和 arrays 是 eqtypes , 但datatype Foo = Foo of (real ref) 不是 eqtype)。
来源:http://mlton.org/PolymorphicEquality
人们可能期望能够比较两个实数 t 类型的值,因为在 ref 单元上进行指针比较就足够了。不幸的是,类型系统只能表示用户定义的数据类型是否承认相等。
我想知道是否可以阻止 eqtyping。比如说,我正在将一个集合实现为二叉树(带有一个不必要的变体),并且我想放弃在结构上比较集合的能力。
datatype 'a set = EmptySet | SetLeaf of 'a | SetNode of 'a * 'a set * 'a set;
假设我不希望人们能够将SetLeaf(5) 和SetNode(5, EmptySet, EmptySet) 与= 区分开来,因为这是一个破坏抽象的操作。
我尝试了一个使用 datatype on = On | Off 的简单示例,只是想看看我是否可以使用签名将类型降级为非 eqtype。
(* attempt to hide the "eq"-ness of eqtype *)
signature S = sig
type on
val foo : on
end
(* opaque transcription to kill eqtypeness *)
structure X :> S = struct
datatype on = On | Off
let foo = On
end
似乎透明归属无法阻止X.on 成为 eqtype,但不透明归属确实阻止了它。但是,这些解决方案并不理想,因为它们引入了新模块并隐藏了数据构造函数。有没有办法防止自定义类型或类型构造函数成为eqtype 或在不隐藏其数据构造函数或引入新模块的情况下承认相等?
【问题讨论】:
标签: sml