使用"elem"时没有(Eq TrafficLight)的实例可能的修复:为(Eq TrafficLight)添加实例声明

bli*_*630 2 haskell

我有一个例子来自于了解你是一个很好的Haskell

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]
Run Code Online (Sandbox Code Playgroud)

并且前三行是有效的,但最后一行包含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]'
Run Code Online (Sandbox Code Playgroud)

我寻找解决方案如何为标记的部分添加实例,但没有找到关于该主题的提示,我是Haskell的新手,所以提前感谢

塔马斯

Zet*_*eta 5

你必须提供自己的elem.什么是elem类型?

elem :: Eq a => a -> [a] -> Bool
Run Code Online (Sandbox Code Playgroud)

但是,您的红绿灯没有Eq实例.它有一个Eq1实例.

你必须自己写elem1:

elem1 :: Eq1 a => a -> [a] -> Bool
elem1 y xs = -- exercise
Run Code Online (Sandbox Code Playgroud)