我有这种数据类型,我想为它定义一个相等运算符。 Mlist应该是Eq。
的实例data Mlist a = Mlist [a]
instance Eq a => Eq (Mlist a) where
(==) :: [a] -> [a] -> Bool
相等运算符应该允许我检查这个(加上顺序无关紧要):
m1 = Mlist [1,2,3]
m2 = Mlist [3,1,2]
-- then m1 equals m2
m3 = Mlist [3,2,1,5]
-- then m1 not equals m3
顶级代码无效,任何人都可以帮忙吗?
编辑: 这是一个新版本,但它不起作用......
instance Eq a => Eq (Mlist a) where
(==) :: (Eq a) => [a] -> [a] -> Bool
(==) [] [] = True
(==) [] _ = False
(==) _ [] = False
(==) (hd:tl) b = (==) tl $ delete hd b
答案 0 :(得分:9)
要使Mlist a
成为Eq
的实例,您必须定义
(==) :: Mlist a -> Mlist a -> Bool
或
(/=) :: Mlist a -> Mlist a -> Bool
实质上,您需要实现一个可以确定两个列表是否相等的函数。由于Eq
是唯一约束,因此您可以使用Data.List.\\
中的帮助。例如:
instance Eq a => Eq (Mlist a) where
Mlist xs == Mlist ys = length xs == length ys && null (xs \\ ys)
答案 1 :(得分:0)
要解决您的编辑问题:新版本不起作用,因为实例声明不应具有类型签名。类型签名由类提供。
代码仍然不正确,因为您没有考虑hd
不在b
的情况。在这种情况下,delete hd b
仅为b
,特别是如果tl == b
,那么当您确实应该返回True
时,您将返回False
。< / p>