2010-06-06 49 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