[英]Haskell: check if two lists are equal
我想检查两个列表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
动作。
首先,哈马尔的回答是正确的,所以请接受他的回答。 (编辑:你做过的,谢谢。)
listA == listB
(我将挑选你问题中的小细节,主要是为了在Google上找到这个页面的未来初学者的利益。)
其次, 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
您可以替换all (\\x -> x)
与and
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.