结构可以在标准 ML 中实现多个签名吗?
Can a structure implement multiple signatures in Standard ML?
我最近想知道标准 ML 结构是否可以实现多个签名,类似于 class 可以在 Java 中实现多个接口。快速搜索显示 this web page Bob Harper 说这确实是可能的(强调我的):
[...] the relationship between signatures and structures in ML is
many-to-many, whereas in some languages (such as Modula-2) the
relationship is one-to-one or many-to-one. This means that in ML a
signature may serve as the interface for many different structures,
and that a structure may implement many different signatures.
但是,我找不到语法,粗略地查看了修改后的定义中的模块语法,似乎不支持上述引用。
我的问题是:
- 可能吗?
- 如果是,语法是什么?
编辑:经过一番尝试,我认为 Bob Harper 实际上指的是 签名匹配。这个片段是一个小例子,其中一个结构被发现与两个不同的签名相匹配:
signature S1 = sig val s1 : int end
signature S2 = sig val s2 : string end
functor F1 (A : S1) = struct val f1 = A.s1 end
functor F2 (B : S2) = struct val f2 = B.s2 end
structure C =
struct
val s1 = 1
val s2 = "1"
end
structure F1C = F1 (C)
structure F2C = F2 (C)
在这一点上,我认为,是的,一个结构可以被视为实现多个签名,但是没有办法在结构声明中使用签名规范来强制执行,例如:
structure C : S1 and S2 = ...
没有语法可以用 单个 注释来强制执行它,但是你可以,例如做
structure C = struct ... end
structure C1 : S1 = C
structure C2 : S2 = C
如果您只想进行健全性检查但避免使用辅助结构名称污染作用域,您可以将它们设为本地:
structure C = struct ... end
local
structure C1 : S1 = C
structure C2 : S2 = C
in end
遗憾的是,不能在结构绑定中使用通配符...
你建议的符号会很棘手,因为它实际上会在签名上引入交集运算符。这具有深远的影响。考虑一下,例如:
signature S1 = sig type 'a t; val v : int t; val w : string t end
signature S2 = sig val v : int end
functor F (X : S1 and S2) = (* what is X.t here? *)
X.t
的类型有两种可能的解决方案,以便 X.v
的类型与两个签名一致:
type 'a t = int
或
type 'a t = 'a
问题是它们没有可比性,即 none 比另一个好。在一种情况下 X.w
是一个整数,在另一种情况下是一个字符串。从本质上讲,这里发生的是你通过后门引入了一种高阶统一形式,这在一般情况下是不可判定的。
我最近想知道标准 ML 结构是否可以实现多个签名,类似于 class 可以在 Java 中实现多个接口。快速搜索显示 this web page Bob Harper 说这确实是可能的(强调我的):
[...] the relationship between signatures and structures in ML is many-to-many, whereas in some languages (such as Modula-2) the relationship is one-to-one or many-to-one. This means that in ML a signature may serve as the interface for many different structures, and that a structure may implement many different signatures.
但是,我找不到语法,粗略地查看了修改后的定义中的模块语法,似乎不支持上述引用。
我的问题是:
- 可能吗?
- 如果是,语法是什么?
编辑:经过一番尝试,我认为 Bob Harper 实际上指的是 签名匹配。这个片段是一个小例子,其中一个结构被发现与两个不同的签名相匹配:
signature S1 = sig val s1 : int end
signature S2 = sig val s2 : string end
functor F1 (A : S1) = struct val f1 = A.s1 end
functor F2 (B : S2) = struct val f2 = B.s2 end
structure C =
struct
val s1 = 1
val s2 = "1"
end
structure F1C = F1 (C)
structure F2C = F2 (C)
在这一点上,我认为,是的,一个结构可以被视为实现多个签名,但是没有办法在结构声明中使用签名规范来强制执行,例如:
structure C : S1 and S2 = ...
没有语法可以用 单个 注释来强制执行它,但是你可以,例如做
structure C = struct ... end
structure C1 : S1 = C
structure C2 : S2 = C
如果您只想进行健全性检查但避免使用辅助结构名称污染作用域,您可以将它们设为本地:
structure C = struct ... end
local
structure C1 : S1 = C
structure C2 : S2 = C
in end
遗憾的是,不能在结构绑定中使用通配符...
你建议的符号会很棘手,因为它实际上会在签名上引入交集运算符。这具有深远的影响。考虑一下,例如:
signature S1 = sig type 'a t; val v : int t; val w : string t end
signature S2 = sig val v : int end
functor F (X : S1 and S2) = (* what is X.t here? *)
X.t
的类型有两种可能的解决方案,以便 X.v
的类型与两个签名一致:
type 'a t = int
或
type 'a t = 'a
问题是它们没有可比性,即 none 比另一个好。在一种情况下 X.w
是一个整数,在另一种情况下是一个字符串。从本质上讲,这里发生的是你通过后门引入了一种高阶统一形式,这在一般情况下是不可判定的。