2017-02-18 12 views
2

У меня есть пример из научат Вас в Haskell ради Добра имениНи одного случая для (Eq TrafficLight), возникающего из использования `эля» Возможных исправлений: добавить объявление экземпляра для (Eq TrafficLight)

class Eq1 a where 
    (===), (=/=) :: a -> a -> Bool 
    x === y = not $ x =/= y 
    x =/= y = not $ x === y 

data TrafficLight = Red | Yellow | Green 

instance Eq1 TrafficLight where 
    Red === Red = True 
    Green === Green = True 
    Yellow === Yellow = True 
    _ === _ = False 


instance Show TrafficLight where 
    show Red = "Red light" 
    show Yellow = "Yellow light" 
    show Green = "Green light" 


main = do 
    print $ Red === Red 
    print $ Red === Yellow 
    print $ [Red, Yellow, Green] 
    print $ Red `elem` [Red, Yellow, Green] 

и первые три строк являются работой, но последняя строка содержит elem не делает, получили ошибку:

No instance for (Eq TrafficLight) arising from a use of `elem' 
    Possible fix: add an instance declaration for (Eq TrafficLight) 
    In the second argument of `($)', namely 
     `Red `elem` [Red, Yellow, Green]' 

я искать решение, как я могу добавить экземпляр для отмеченной части, но не нашел подсказки по теме, я новичок в Haskell, поэтому заранее заблаговременно

Tamas

ответ

5

Вы должны указать свой собственный elem. Что такое elem?

elem :: Eq a => a -> [a] -> Bool 

Однако, ваш светофор не имеет экземпляра Eq. Он имеет экземпляр Eq1.

Вы должны написать свой собственный elem1:

elem1 :: Eq1 a => a -> [a] -> Bool 
elem1 y xs = -- exercise 
+0

спасибо @Zeta :) – bling5630