簡體   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