2010-02-19 20 views
3

試圖創建一個基類,我可以從中派生出不同類型。以下有什麼問題?如何正確實例化Haskell中的類?

class (Eq a) => MyClass a 

data Alpha = Alpha 
instance MyClass Alpha where 
    Alpha == Alpha = True 

我得到的錯誤:

test.hs:5:10: `==' is not a (visible) method of class `MyClass' 
Failed, modules loaded: none. 

回答

8

你必須讓阿爾法式的實例明確。這將工作:

data Alpha = Alpha 
instance Eq Alpha where 
    Alpha == Alpha = True 
instance MyClass Alpha 
+0

謝謝。所以如果我有一個繼承的字符串,我必須實例化每個派生類,並且不能一次完成它們。 – me2

+3

是正確的,但你應該把它看作更像「如果一個實例化MyClass,它首先需要實例化Eq」而不是繼承。 – sepp2k

2

第一行說你需要首先聲明Alpha的一個實例,然後是MyClass。

1

基於問題的結構,似乎您希望Haskell類型類以類似於面嚮對象語言中的類的方式行爲。類型類更像Java接口。

沒有繼承。類型類只是對一個類型實現的一組函數的描述。與Java接口不同,這些函數可以相互定義,因此一個最小完整的實例聲明可能只需要定義一些函數。