结构可以在Standard ML中实现多个签名吗?

Ion*_*tan 3 types sml

我最近想知道标准ML结构是否可以实现多个签名,类似于类如何在Java中实现多个接口.快速搜索显示了这个网页,其中Bob Harper说这确实是可能的(强调我的):

[...] ML中签名和结构之间的关系是 多对多的,而在某些语言(如Modula-2)中,这种关系是一对一或多对一的.这意味着在ML中,签名可以用作许多不同结构的接口,并且结构可以实现许多不同的签名.

但是,我找不到语法,粗略看一下修订后的定义中的模块语法似乎不支持上面的引用.

我的问题是:

  1. 可能吗?
  2. 如果是的话,语法是什么?

编辑:经过一些游戏,我认为鲍勃哈珀实际上是指签名匹配.这个片段是一个小例子,其中找到一个结构作为两个不同签名的匹配:

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)
Run Code Online (Sandbox Code Playgroud)

在这一点上,我认为,是的,结构可以被视为实现多个签名,但是没有办法在结构声明中使用签名规范来强制执行,例如:

structure C : S1 and S2 = ...
Run Code Online (Sandbox Code Playgroud)

And*_*erg 5

没有语法可以使用单个注释来强制执行它,但您可以这样做

structure C = struct ... end
structure C1 : S1 = C
structure C2 : S2 = C
Run Code Online (Sandbox Code Playgroud)

如果您只想进行完整性检查,但避免使用辅助结构名称污染范围,则可以将它们设置为本地:

structure C = struct ... end
local
  structure C1 : S1 = C
  structure C2 : S2 = C
in end
Run Code Online (Sandbox Code Playgroud)

不幸的是,人们不能在结构绑定中使用通配符......

你建议的符号会很棘手,因为它会有效地在签名上引入交叉算子.这具有深远的影响.例如,考虑一下:

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? *)
Run Code Online (Sandbox Code Playgroud)

对于什么类型,有两种可能的解决方案,X.t以便类型X.v与两个签名一致:要么

type 'a t = int
Run Code Online (Sandbox Code Playgroud)

要么

type 'a t = 'a
Run Code Online (Sandbox Code Playgroud)

问题是它们是无与伦比的,即没有一个比另一个好.在一种情况下,X.w将是一个int,在另一种情况下是一个字符串.从本质上讲,这里发生的是你通过后门引入一种高阶统一的形式,在一般情况下已知这种形式是不可判定的.