[英]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.