2015-09-04 18 views
0

讀我聲明一個類和兩個實例:功能將無法從兩個類型類

class A a where 
    name :: a -> String 
    dMs :: a -> [(String,String,Double)] 

instance A B where 
    name s = B s 
    dMs a = dM a 

instance A C where 
    name s = C s 
    dMs a = dM a 

dM :: (A a) => [a] -> [(String,String,Double)] 

但是,當我編譯我的頭球攻門高出我得到一個錯誤:

Couldn't match expected type ‘[a0]’ with actual type ‘C’ 
    In the first argument of ‘dM’, namely ‘a’ 
    In the expression: dM a 

我想要的dM函數能夠獲取BC類型的列表。

如果我改變頭只接受一種類型(或者只是B或者只是C)代碼編譯和工作沒有一個小故障。

+0

你在哪裏定義了'B'和'C'? – Sibi

+0

@Sibi前面的代碼。每個數據都是一個名稱和一些其他相關值的數據。他們各自單獨工作。 – Gurkmeja101

+0

嘗試在您的類型類中直接定義dM作爲默認實現。目前,您正嘗試在實例本身的定義內部使用B/C的實例。 – thoferon

回答

0

我現在工作。

class A a where 
    name :: a -> String 
    dMs :: [a] -> [(String,String,Double)] 

instance A B where 
    name s = B s 
    dMs a = dM a 

instance A C where 
    name s = C s 
    dMs a = dM a 

dM :: (A a) => [a] -> [(String,String,Double)] 

所以它幹了什麼被指定在Class,它應該採取的a列表,像這樣:[a]

感謝大家的幫助。