包括两个签名,都带有'type t'[标准ML]

时间:2010-06-06 00:17:08

标签: include signature sml

一个人为的例子:

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内发生两次投诉。但有没有办法表达我希望将两个t等同起来,结果是:

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

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

此外,我知道通过检查语言的语法来解决明显(或缺乏)的问题,可以简单地回答这个问题,但我无法在互联网上的任何地方找到完整的语法。

(FWIW,我尝试这样做的实际原因是Haskell风格的monad等,其中MonadPlus只是MonadAlternative的混合;目前我正在重复ALTERNATIVEMONAD_PLUS的内容,这让我觉得不太理想。)

2 个答案:

答案 0 :(得分: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相同,并且使用与值z的类型相同的t。

标准ML'97的语法可用here

答案 1 :(得分:2)

你被软管了。正如Jordan Lewis建议的那样,你能做的最好的事情就是使用子结构和共享条款。 include两个定义t的两个不同签名始终是错误。因此,按照您希望的方式混合ALTERNATIVEMONAD_PLUS是行不通的。

有关include错误的其他内容以及解决方法的建议,请参阅An Expressive Language of Signatures