2016-11-20 3 views
1

Я пытаюсь создать экземпляр Eq для моего созданного типа списка. Eq должен возвращать true, только если оба средних списка равны.Пытается создать экземпляр экземпляра Haskell

average :: (Real a, Fractional b) => [a] -> b 
average xs 
    | xs == [] = 0 
    | otherwise = realToFrac (sum xs)/genericLength xs 

data NumList a = Nlist [a] 

instance Eq (NumList a) where 
    (Nlist x) == (Nlist y) = (average x) == (average y)` 

Но когда я пытаюсь скомпилировать это я получаю сообщение об ошибке:

No instance for (Real a) arising from a use of ‘average’ 
Possible fix: 
    add (Real a) to the context of the instance declaration 
In the first argument of ‘(==)’, namely ‘(average x)’ 
In the expression: (average x) == (average y) 
In an equation for ‘==’: 
(Nlist x) == (Nlist y) = (average x) == (average y) 

Я не хорошо с Haskell и пытается узнать его, может кто-нибудь помочь мне с этой ошибкой?

+2

Что делать, если у вас есть 'NumList Banana'? Как вы усредняете список бананов? – MathematicalOrchid

+0

Я понимаю, что я должен сделать какое-то ограничение экземпляра, но не знаю, как это сделать. Как сказать, что это может быть только список номеров? –

ответ

5

Вам нужно то же ограничение типа для экземпляра Eq:

instance (Real a) => Eq (NumList a) where 
    (Nlist x) == (Nlist y) = (average x) == (average y)` 
+0

Черт, я глуп ... Я пытался «Eq (NumList a) => (Real a)' Большое спасибо –

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