我想检查两个列表 A
和 B
是否相等,即 a1 == b1, a2 == b2
,...
我有一个可行的解决方案:
all (\x->x) zipWith $ (==) A B
另一个想法是递归实现:a:as,b:bs
;检查a1==b1
并使用剩余列表as
和bs
调用函数。但是,有没有更简单和更易读的方法来实现这个?
==
。> [1, 2, 3] == [1, 2, 3]
True
> [1, 2, 3] == [1, 2]
False
这是因为==
是Eq
类型类的一部分,而列表有一个Eq
实例,大致如下:
instance Eq a => Eq [a]
这意味着只要元素类型也实例化了Eq
,列表就会实例化Eq
。对于标准预定义类型而言,除了函数和IO
操作之外,它们都是如此。
首先,hammar的回答是正确的,请接受他的答案。(编辑:你已经这么做了,谢谢。)
listA == listB
(我将在你的问题中挑剔一些细节,主要是为了未来通过谷歌搜索找到这个页面的初学者的利益。)
其次,A
和B
不是列表:它们以大写字母开头,因此它们不能是变量。我要把它们称为listA
和listB
。
第三,在您的工作解决方案中存在一个拼写错误:美元符号$
应该在zipWith
之前而不是之后。在您的问题中出现的方式会导致编译错误。 我想你的意思是这样的:
all (\x->x) $ zipWith (==) listA listB
第四,(\x->x)
更为人所知的是函数 id
。
all id $ zipWith (==) listA listB
第五点,正如Matvey指出的那样,all id
与and
是相同的。
and $ zipWith (==) listA listB
第六点,当列表长度不同时,它们会执行不同的操作。在列表上直接使用(==)
会得到False
,而zipWith
会忽略多余的元素。也就是说:
[1,2,3] == [1,2] -- False
and $ zipWith (==) [1,2,3] [1,2] -- True
现在,可能存在你想要第二种行为的情况。但你几乎肯定想要第一种行为。
最后,强调一下,直接在列表上使用(==)
即可:
listA == listB
and
替换all(\x -> x)
。
A == B
。 - Matvey Aksenovas == bs
即可告诉您它们是否相等。 - Ingo[1,2,3]
和[1,2,3,4]
视为相等,但(==)
不会这样做。 - Matvey Aksenov