5

一个人为的例子:

signature A =
sig
  type t
  val x: t
end

signature B =
sig
  type t
  val y: t
end

signature C = sig include A B end

显然,这会导致投诉type tC. 但是有什么方法可以表达我希望两个ts 相等,最终得到:

signature C =
sig
  type t
  val x: t
  val y: t
end

我尝试了各种愚蠢的语法,如include B where type t = A.t,不出所料,这不起作用。有什么我忘记尝试的吗?

另外,我知道这可以通过检查语言的语法是否有任何明显(或缺乏)来简单地回答,但我在互联网上的任何地方都找不到完整的语法。

(FWIW,我尝试这样做的真正原因是 Haskell 风格的 monad 等,其中 aMonadPlus只是 aMonad和 an的混合Alternative;目前我只是在重复ALTERNATIVEin的内容MONAD_PLUS,这让我觉得少比理想。)

4

2 回答 2

2

您正在寻找共享条款。

signature C =
sig
  structure A1 : A
  structure B1 : B
  sharing type A1.t = B1.t
  type t = A1.t
  val z : t
end

这确保了 A1 的 t 和 B1 的 t 相同,并且使用相同的 t 作为值 z 的类型。

标准 ML '97 语法可在此处获得。

于 2010-06-06T01:07:47.410 回答
2

你受够了。正如 Jordan Lewis 建议的那样,你能做的最好的事情就是使用子结构和共享条款。对于include两个都定义t的不同签名始终是错误的。所以混合ALTERNATIVEMONAD_PLUS你想要的方式是行不通的。

For a proposal of other things that are wrong with include and how to fix them, see An Expressive Language of Signatures.

于 2010-06-06T01:27:17.510 回答