似乎无法让我的头绕着'列表差异'(\\)运算符

问题描述:

我已经在Haskell中听到'列表差异'(\\)运算符这个术语,但仍然不太了解如何解决它。任何示例或想法?似乎无法让我的头绕着'列表差异'(\)运算符

简而言之,它需要两个列表,通过第二个列表并且对于每个项目,从第一个列表中删除相同项目的第一个实例。

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

假设,你有一个东西的列表,例如城市。让我们拿这个清单为例:

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

(\\) 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

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