Haskell:检查两个列表是否相等

时间:2011-12-01 09:46:43

标签: list haskell

我想检查两个列表AB是否相等,即a1 == b1, a2 == b2,...

我有一个有效的解决方案:

all (\x->x) zipWith $ (==) A B

另一个想法是递归地做:a:as, b:bs;检查是否a1==b1并使用其余列表asbs调用该函数。但是,有没有更简单,更易读的方法呢?

3 个答案:

答案 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上找到此页面的未来初学者的利益。)

其次,AB不是列表:它们以大写字母开头,因此它们不能是变量。我将打电话给他们listAlistB

第三,您的工作解决方案中存在拼写错误:$应该在zipWith之前,而不是在all (\x->x) $ zipWith (==) listA listB 之后。它出现在您的问题中的方式导致编译错误。我想你的意思是:

(\x->x)

第四,id更好地称为函数all id $ zipWith (==) listA listB

all id

第五,Matvey指出,andand $ 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