【发布时间】:2021-03-18 05:07:22
【问题描述】:
我自己在 Haskell 中实现列表,但是在比较两个列表是否相等时遇到了一点问题,
data List a = Void | Cons a (List a) -- deriving (Show, Eq)
instance (Eq a) => Eq (List a) where
(==) a b = equalHelp a b
equalHelp :: (Eq a) => List a -> List a -> Bool
equalHelp Void Void = True
equalHelp a Void = False
equalHelp Void b = False
equalHelp (Cons a b) l = if (myElem a l) then (equalHelp b l) else False
myElem :: (Eq a) => a -> List a -> Bool
myElem a Void = False
myElem a (Cons c d) = if (a == c) then True
else myElem a d
例如,如果我有
l1 = (Cons 1 (Cons 2 (Cons 3 (Cons 4 (Cons 5 Void)))))
如果我执行l1 == l1,则不是打印True,而是打印False。
我错过了什么?
【问题讨论】:
-
(1) 如果你取两个相等的列表并从其中一个中删除第一个元素,它们将不再相等。 (2) 无论如何,你不需要
myElem来实现(==);只需在每一步直接比较列表标题即可。 -
if A then B else False与A && B相同。 -
而
if A then True else B与A || B相同。 -
@molbdnilo 是的。我当时还没有读到这么远。 :)
标签: haskell methods equality algebraic-data-types custom-data-type