2010-06-06 55 views
4

一个人为的例子:包含两个签名,都与一个“类型T” [标准ML]

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 s到相提并论,与结束了:

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

我试过各种愚蠢的语法像include B where type t = A.t,这勿庸置疑没有工作。有什么我忘记试试吗?

另外,我知道这只是简单地通过检查语言的语法来解决任何明显(或缺少)的问题,但我无法在互联网上的任何位置找到完整的语法。

(FWIW,我试图做到这一点的实际原因是哈斯克尔式的单子和这样的,其中MonadPlus只是一个MonadAlternative的组合;此刻我只是重复的内容ALTERNATIVE in MONAD_PLUS,这让我觉得不太理想。)

回答

2

你被洗了。正如乔丹刘易斯所说,你所能做的最好的是使用子结构和共享条款。至include两个不同的签名都定义为t始终是一个错误。所以混合ALTERNATIVEMONAD_PLUS在你想不会工作的方式。

有关include错误的其他提示以及如何解决,请参阅An Expressive Language of Signatures

1

您正在寻找共享条款。

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