我有这个数据类型,我想为它定义一个相等运算符。 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

最佳答案

要使 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)

关于haskell - 如何在 Haskell 中为类创建相等运算符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15319508/

10-11 22:35
查看更多