繁体   English   中英

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

[英]Haskell: check if two lists are equal

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

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

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

另一个想法是递归地做: a:as, b:bs ; 检查a1==b1和调用函数与其余列表asbs 但是,有没有更简单,更易读的方法来做到这一点?

你可以直接使用==

> [1, 2, 3] == [1, 2, 3]
True
> [1, 2, 3] == [1, 2]
False

这是因为==Eq类型类的一部分,并且列表的Eq实例看起来像这样:

instance Eq a => Eq [a]

这意味着,列出了实例Eq只要元素类型还实例化Eq ,这是在除了功能和标准前奏曲定义的所有类型的情况下IO动作。

首先,哈马尔的回答是正确的,所以请接受他的回答。 (编辑:你做过的,谢谢。)

listA == listB

(我将挑选你问题中的小细节,主要是为了在Google上找到这个页面的未来初学者的利益。)

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

第三,你的工作解决方案中有一个拼写错误: $应该在zipWith之前,而不是之后。 它出现在您的问题中的方式导致编译错误。 我想你的意思是:

all (\x->x) $ zipWith (==) listA listB

第四, (\\x->x)更好地称为函数id

all id $ zipWith (==) listA listB

第五,Matvey指出, all idand

and $ zipWith (==) listA listB

第六,当列表具有不同的长度时,这些做不同的事情。 直接在列表上使用(==)将导致False ,而zipWith将忽略多余的元素。 那是:

[1,2,3] == [1,2]                   -- False
and $ zipWith (==) [1,2,3] [1,2]   -- True

现在,您可能需要第二种行为。 但你几乎肯定想要第一个行为。

最后,要强调,只需在列表上直接使用(==)

listA == listB

您可以替换all (\\x -> x)and

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM