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

时间:2015-03-01 01:00:39

标签: types sml

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

  

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

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

我的问题是:

  1. 有可能吗?
  2. 如果是,那么语法是什么?
  3. 编辑:经过一番游戏后,我认为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 = ...
    

1 个答案:

答案 0 :(得分:5)

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

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

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