2011-05-29 34 views

回答

7

簡而言之,它需要兩個列表,通過第二個列表並且對於每個項目,從第一個列表中刪除相同項目的第一個實例。

> [1..10] \\ [2, 3, 5, 8] 
[1,4,6,7,9,10] 
> [1, 2, 1, 2, 1, 2] \\ [2] 
[1,1,2,1,2] 
> [1, 2, 1, 2, 1, 2] \\ [2, 2] 
[1,1,1,2] 
> [1, 2, 1, 2, 1, 2] \\ [2, 2, 1] 
[1,1,2] 
0

假設,你有一個東西的列表,例如城市。讓我們拿這個清單爲例:

a = ["London","Brussels","Tokio","Los Angeles","Berlin","Beijing"] 

現在你想要刪除所有在歐洲的城市。要知道,這些城市都在歐洲:

b = ["Glasgow","Paris","Bern","London","Madrid","Amsterdam","Berlin","Brussels"] 

要獲得a城市,不在歐洲,所以不在b的列表,你可以使用(\\)

a \\ b = ["Tokio","Los Angeles","Beijing"] 
+0

如何做到這一點沒有差異運算符? – matthias 2016-01-01 21:29:37

+1

@matthias您可以將'(\\)'實現爲'a \\ b = filter(不是。flip elem b)a'。 – fuz 2016-01-01 21:32:32

+0

對不起還有一件事...你可以寫非點免費的嗎? – matthias 2016-01-01 22:16:37

9

(\\) operator(和the difference function)實現set difference,所以,如果你有兩個列表,ab,它只返回那些未b那些a元素,如圖所示:

enter image description here

+5

但它實際上實現了多組差異;參數列表允許多次包含相同的元素。 – augustss 2011-05-29 15:39:17

+0

如果我有這樣的聲明:diff ::(Eq a)=> [a] - > [a] - > [a]我想找出2個列表之間的區別?我應該如何繼續? – Madalina 2017-05-11 14:40:10

2

xs \\ ys是所有在xs不在ys的元素。也許一個列表解析會澄清這一點:

xs \\ ys = [ x | x <- xs, x `notElem` ys ] 

,或者,如果你能做到這一點在Haskell,

xs \\ ys = [ x | x `elem` xs, x `notElem` ys ] 

這來自set theoryset difference。基本的想法是你正在「減去」另一個元素的集合,因此術語「差異」。

+0

如果我有這樣的聲明:diff ::(Eq a)=> [a] - > [a] - > [a]我想找出2個列表之間的區別?我應該如何繼續? – Madalina 2017-05-11 14:39:58