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

mor*_*ort 21 haskell list

我要检查,如果两个列表AB相等,即a1 == b1, a2 == b2,...

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

all (\x->x) zipWith $ (==) A B
Run Code Online (Sandbox Code Playgroud)

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

ham*_*mar 50

你可以直接使用==它们.

> [1, 2, 3] == [1, 2, 3]
True
> [1, 2, 3] == [1, 2]
False
Run Code Online (Sandbox Code Playgroud)

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

instance Eq a => Eq [a]
Run Code Online (Sandbox Code Playgroud)

这意味着Eq只要元素类型也实例化Eq,列表就会实例化,除了函数和IO操作之外,标准Prelude中定义的所有类型都是这种情况.


dav*_*420 47

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

listA == listB
Run Code Online (Sandbox Code Playgroud)

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

其次,AB不是列表:他们开始用大写字母,所以不能为变量.我要打电话给他们listA,并listB代替.

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

all (\x->x) $ zipWith (==) listA listB
Run Code Online (Sandbox Code Playgroud)

第四,(\x->x)更好地称为功能id.

all id $ zipWith (==) listA listB
Run Code Online (Sandbox Code Playgroud)

第五,正如Matvey指出的那样,all id是一样的and.

and $ zipWith (==) listA listB
Run Code Online (Sandbox Code Playgroud)

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

[1,2,3] == [1,2]                   -- False
and $ zipWith (==) [1,2,3] [1,2]   -- True
Run Code Online (Sandbox Code Playgroud)

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

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

listA == listB
Run Code Online (Sandbox Code Playgroud)

  • 是的,非常模糊的字母.关闭键盘的抗锯齿:-) (7认同)

Mat*_*nov 11

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