【问题标题】:Can a structure implement multiple signatures in Standard ML?一个结构可以在标准 ML 中实现多个签名吗?
【发布时间】:2015-05-01 13:41:00
【问题描述】:

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

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

但是,我找不到语法,并且粗略查看了修改后定义中的模块语法似乎不支持上述引用。

我的问题是:

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

编辑:经过一番玩弄之后,我认为 Bob Harper 实际上指的是签名匹配。这个 sn-p 是一个小例子,其中找到一个结构作为两个不同签名的匹配项:

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 = ...

【问题讨论】:

    标签: types sml


    【解决方案1】:

    没有语法可以使用 single 注释来强制执行它,但是您可以例如做

    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,在另一种情况下是一个字符串。本质上,这里发生的事情是您将通过后门引入一种高阶统一形式,众所周知,在一般情况下这是不可判定的。

    【讨论】:

    • 谢谢。似乎结构类型真正重要的唯一地方是函子的参数,我们不能将相同的结构用作两个不同的签名。除非,我们应用你的技巧F (structure C1 = C; structure C2 = C)。我也意识到会有一种组合两个签名的方法,使用include:signature S12 = sig include S1 include S2 end。但是,是的,它无法使用您为交集类型提供的示例进行编译。
    • @IonuțG.Stan,这不太正确。您当然可以手动写出您想要的组合签名(如果存在),它将是 S1 和 S2 的子类型(因为签名是结构类型)。您只是不能将其表示为交集。另外,我不确定我是否了解您要达到的目标。为什么要编写这样的函子?
    • 这是一个纯粹出于好奇的问题,我实际上并没有尝试对此做些什么。另外,关于include。我意识到我可以手动合并两个签名,但使用 include 将是一种“组合”两个签名而不实际声明一个签名的方法。喜欢:structure C : sig include S1 include S2 end = ...。对于structure C : S1 and S2 = ...,这看起来像是一个更冗长的符号,但它没有交集类型的语义。
    猜你喜欢
    • 2019-12-18
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多