一个人为的例子:
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 t
在C
内发生两次投诉。但有没有办法表达我希望将两个t
等同起来,结果是:
signature C =
sig
type t
val x: t
val y: t
end
我尝试了各种愚蠢的语法,例如include B where type t = A.t
,这无疑不起作用。有什么我忘记尝试的吗?
此外,我知道通过检查语言的语法来解决明显(或缺乏)的问题,可以简单地回答这个问题,但我无法在互联网上的任何地方找到完整的语法。
(FWIW,我尝试这样做的实际原因是Haskell风格的monad等,其中MonadPlus
只是Monad
和Alternative
的混合;目前我正在重复ALTERNATIVE
中MONAD_PLUS
的内容,这让我觉得不太理想。)
答案 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
的两个不同签名始终是错误。因此,按照您希望的方式混合ALTERNATIVE
和MONAD_PLUS
是行不通的。
有关include
错误的其他内容以及解决方法的建议,请参阅An Expressive Language of Signatures。