2015-05-17 79 views
6

的代碼看起來是這樣的:在Haskell中,如何自動派生這樣的自定義類?

class MyAnd a where 
    myAnd :: (Show a) => a -> a -> String 
    x `myAnd` y = (show x) ++ " and " ++ (show y) 

data TrafficLight = Red | Yellow | Green deriving(Show, MyAnd) 

這裏MyAnd是具有功能myAnd一個類型的類,我認爲這是通用的,唯一的限制是a已經到了Show類的一個實例..

TrafficLight類型,它已經從Show型類派生的。然而,當我編譯代碼時,編譯器抱怨

Can't make a derived instance of ‘MyAnd TrafficLight’: 
     ‘MyAnd’ is not a derivable class 
    In the data declaration for ‘TrafficLight’ 
Failed, modules loaded: none. 

有沒有人有關於此的想法?

回答

8

不能使用用戶定義的類派生。通常deriving自動生成給定類的方法,這是唯一可能的,因爲編譯器知道什麼方法都應該做的,因此可以基於你的類型的結構適合實現代碼。這對於用戶定義的類來說顯然是不可能的,因爲編譯器無法知道方法應該如何表現。

在你的情況下,它看起來像你想要的是使用一個方法你的類有默認的實現,所以沒有實施將需要由編譯器生成。當然,這意味着deriving是不是所有必要的,你可以只使用一個實例聲明沒有身體。 PS:如果你總是希望使用該方法的默認實現,那麼最好不要使用類,而只需要將myAnd定義爲一個函數。

+0

真,編譯器不知道什麼方法都應該做的。但是,也許這種語言的一個有價值的補充將是一種告訴它的方式。相關:http://stackoverflow.com/a/3864801/524504 – masterxilo

7

對於這個特定的問題,你可以簡單地避免定義自定義類:

data TrafficLight = Red | Yellow | Green deriving Show 

myAnd :: (Show a) => a -> a -> String 
x `myAnd` y = (show x) ++ " and " ++ (show y) 

現在,myAnd適用於TrafficLight S(以及其他所有Show能夠類型)。

相關問題