在不隐藏构造函数的情况下防止 SML 类型成为 eqtype
Prevent SML type from becoming eqtype without hiding constructors
在 datatype
声明中,如果所有变体的所有类型参数本身都是 eqtype
,则标准 ML 将生成一个相等类型。
我在一些地方看到评论哀叹用户无法提供他们自己的平等定义和构建他们自己的 eqtypes 和 SML 规则的意外后果(例如裸 ref
s 和 array
s 是 eqtype,但 datatype Foo = Foo of (real ref)
不是 eqtype)。
来源:http://mlton.org/PolymorphicEquality
one might expect to be able to compare two values of type real t, because pointer comparison on a ref cell would suffice. Unfortunately, the type system can only express that a user-defined datatype admits equality or not.
我想知道是否可以阻止 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
或承认相等性?
简短的回答是否定的。当类型的定义可见时,它的相等性就是定义所暗示的。防止它成为 eq 的唯一方法是调整定义,例如,通过添加一个带有 real
参数的虚拟构造函数。
顺便说一句,小更正:您的类型 foo
应该是相等类型。如果您的 SML 实现不同意,那么它有一个错误。另一种情况是 real bar
当 datatype 'a bar = Bar of 'a ref
(这是 MLton 手册讨论的内容)。第一个起作用而第二个不起作用的原因是 ref
在 SML 中很神奇:它具有用户类型无法拥有的多态 eq-ness 形式。
在 datatype
声明中,如果所有变体的所有类型参数本身都是 eqtype
,则标准 ML 将生成一个相等类型。
我在一些地方看到评论哀叹用户无法提供他们自己的平等定义和构建他们自己的 eqtypes 和 SML 规则的意外后果(例如裸 ref
s 和 array
s 是 eqtype,但 datatype Foo = Foo of (real ref)
不是 eqtype)。
来源:http://mlton.org/PolymorphicEquality
one might expect to be able to compare two values of type real t, because pointer comparison on a ref cell would suffice. Unfortunately, the type system can only express that a user-defined datatype admits equality or not.
我想知道是否可以阻止 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
或承认相等性?
简短的回答是否定的。当类型的定义可见时,它的相等性就是定义所暗示的。防止它成为 eq 的唯一方法是调整定义,例如,通过添加一个带有 real
参数的虚拟构造函数。
顺便说一句,小更正:您的类型 foo
应该是相等类型。如果您的 SML 实现不同意,那么它有一个错误。另一种情况是 real bar
当 datatype 'a bar = Bar of 'a ref
(这是 MLton 手册讨论的内容)。第一个起作用而第二个不起作用的原因是 ref
在 SML 中很神奇:它具有用户类型无法拥有的多态 eq-ness 形式。