2014-04-27 107 views
1

假設我們有一個模塊A和一個模塊B,其中聲明瞭A和B類型。 在模塊中超,我們想說的是,型超是A或B像下面的代碼:使用導入模塊中的類型創建數據類型

-- module A 
data A = A String 

-- module B 
data B = B Int 

-- module Super 
data Super = A.A 
      | B.B 

但我們不能在數據構造函數中使用完全合格的數據類型,這並不工作(錯誤是:「裝訂位置合格的名稱」),如果我們不把完全合格的名稱像下面,A型和B不是從模塊A和B,其

-- module Super 
data Super = A 
      | B 

至於我的解決辦法是做這樣的

-- module Super 
data Super = A A.A 
      | B B.B 

有沒有更好的方法來實現這一目標?我不知道如果我要使用類型的類

PS: 我的目標是有型超級

let mySuperList = [ B, A ] :: [Super] 

回答

4
let mySuperList = [ Left B, Right A ] :: [Either B A] 

的列表。如果你能逃脫沒有名字的不適當的乘法,你從長遠來看,它可能會發現它更強大。

+0

我不能這樣做,更多的類型會來 –

+3

@Erèbe然後定義你自己的類型'data Union = A A.A | B B.B | C C.C | D D.D | ......並根據需要進行擴展。這比嵌套'Eithers'更有用,即'或者A(B(或者C D))'。您可能還想查看[數據類型點菜](http://www.cs.ru.nl/~W.Swierstra/Publications/DataTypesALaCarte.pdf)論文,其中介紹瞭如何使用N種類型解決此問題,但請記住,這種方法存在一些重要的理論和計算開銷。 – bheklilr

+0

我會閱讀這篇論文。 Merci bienàtoi –