我想检查两个列表A
和B
是否相等,即a1 == b1, a2 == b2
,...
我有一个有效的解决方案:
all (\x->x) zipWith $ (==) A B
另一个想法是递归地做:a:as, b:bs
;检查是否a1==b1
并使用其余列表as
和bs
调用该函数。但是,有没有更简单,更易读的方法呢?
答案 0 :(得分:49)
您可以直接使用==
。
> [1, 2, 3] == [1, 2, 3]
True
> [1, 2, 3] == [1, 2]
False
这是因为==
是Eq
类型类的一部分,并且列表的Eq
实例看起来像这样:
instance Eq a => Eq [a]
这意味着只要元素类型也实例化Eq
,列表就会实例化Eq
,除了函数和IO
操作之外,标准Prelude中定义的所有类型都是如此。< / p>
答案 1 :(得分:47)
首先,哈马尔的回答是正确的,所以请接受他的回答。 (编辑:你做过的,谢谢你。)
listA == listB
(我将挑选你问题中的小细节,主要是为了在Google上找到此页面的未来初学者的利益。)
其次,A
和B
不是列表:它们以大写字母开头,因此它们不能是变量。我将打电话给他们listA
和listB
。
第三,您的工作解决方案中存在拼写错误:$
应该在zipWith
之前,而不是在all (\x->x) $ zipWith (==) listA listB
之后。它出现在您的问题中的方式导致编译错误。我想你的意思是:
(\x->x)
第四,id
更好地称为函数all id $ zipWith (==) listA listB
。
all id
第五,Matvey指出,and
与and $ zipWith (==) listA listB
相同。
(==)
第六,当列表具有不同的长度时,这些会做不同的事情。直接在列表中使用False
会产生zipWith
,而[1,2,3] == [1,2] -- False
and $ zipWith (==) [1,2,3] [1,2] -- True
会忽略多余的元素。那就是:
(==)
现在,您可能需要第二种行为。但你几乎肯定想要第一种行为。
最后,要强调的是,只需在列表中直接使用listA == listB
:
{{1}}
答案 2 :(得分:11)
您可以将all (\x -> x)
替换为and
。