2015-09-04 2 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 функция, чтобы иметь возможность принимать список типов B или C.

Если я изменю заголовок, чтобы принять только один тип (либо только B, либо просто C), код компилируется и работает без сбоев.

+0

Где вы определили 'B' и' C'? – Sibi

+0

@ Сиби Раньше в коде. Каждый из них является «данными» с именем и некоторыми другими соответствующими значениями. Каждый из них работает индивидуально. – 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].

Спасибо за помощь всем.

Смежные вопросы