2011-07-14 114 views
4

我有一些代數數據類型A,B和C各實現類:哈斯克爾類型類與代數數據類型

class Dog a where 
    dog :: a -> Bool 

如果我創建一個新的代數數據類型:

data D = A | B | C 

是有一個簡單的方法讓D實現Dog,而不必爲A,B和C重新定義每個實例?

感謝

+1

你的意思是創建一個新的數據類型*使用*原件?或者將現有的類型合併成一個替換它們的類型?儘管在這兩種情況下,答案可能都是「不,不是真的」。 :T –

+0

狗與D的關係如何?你究竟想要做什麼? dog :: D - > Bool dog A = True dog B = False 這樣的事情? – eternalmatt

回答

8

回答之前,我要指出,你可能會陷入一個共同的初學者的關於ADT的誤解。請記住,Haskell爲類型和術語級別有兩個單獨的命名空間。因此,如果我們寫:

data A = Foo 
data B = Bar 
data C = Baz 
data D = A | B | C 

...再有就是類型AD類型的構造A之間沒有任何聯繫。因此,我懷疑(但我不能完全確定!)你的問題意味着問有以下格式D類型,而不是:

data D = A A | B B | C C 

在這種情況下,簡單的答案是「不」。你可能希望你可以用deriving Dog或其他類似的東西來完成,但這個工具不是由該語言提供的。也就是說,有一些用於泛型編程的軟件包可以幫助您:只需檢查Hackage軟件包列表並搜索「deriv」,即可獲得大約10次點擊。

+0

感謝您的回答,併爲正確的假設。這正是我想知道的。 –