如何在Haskell中为类创建一个等于运算符?

时间:2013-03-10 06:14:34

标签: haskell

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

2 个答案:

答案 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>