我有一些代數數據類型A,B和C各實現類:哈斯克爾類型類與代數數據類型
class Dog a where
dog :: a -> Bool
如果我創建一個新的代數數據類型:
data D = A | B | C
是有一個簡單的方法讓D實現Dog,而不必爲A,B和C重新定義每個實例?
感謝
我有一些代數數據類型A,B和C各實現類:哈斯克爾類型類與代數數據類型
class Dog a where
dog :: a -> Bool
如果我創建一個新的代數數據類型:
data D = A | B | C
是有一個簡單的方法讓D實現Dog,而不必爲A,B和C重新定義每個實例?
感謝
回答之前,我要指出,你可能會陷入一個共同的初學者的關於ADT的誤解。請記住,Haskell爲類型和術語級別有兩個單獨的命名空間。因此,如果我們寫:
data A = Foo
data B = Bar
data C = Baz
data D = A | B | C
...再有就是類型A
和D
類型的構造A
之間沒有任何聯繫。因此,我懷疑(但我不能完全確定!)你的問題意味着問有以下格式D
類型,而不是:
data D = A A | B B | C C
在這種情況下,簡單的答案是「不」。你可能希望你可以用deriving Dog
或其他類似的東西來完成,但這個工具不是由該語言提供的。也就是說,有一些用於泛型編程的軟件包可以幫助您:只需檢查Hackage軟件包列表並搜索「deriv」,即可獲得大約10次點擊。
感謝您的回答,併爲正確的假設。這正是我想知道的。 –
你的意思是創建一個新的數據類型*使用*原件?或者將現有的類型合併成一個替換它們的類型?儘管在這兩種情況下,答案可能都是「不,不是真的」。 :T –
狗與D的關係如何?你究竟想要做什麼? dog :: D - > Bool dog A = True dog B = False 這樣的事情? – eternalmatt