似乎无法让我的头绕着'列表差异'(\\)运算符
答
简而言之,它需要两个列表,通过第二个列表并且对于每个项目,从第一个列表中删除相同项目的第一个实例。
> [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"]
答
xs \\ ys
是所有在xs
不在ys
的元素。也许一个列表解析会澄清这一点:
xs \\ ys = [ x | x <- xs, x `notElem` ys ]
,或者,如果你能做到这一点在Haskell,
xs \\ ys = [ x | x `elem` xs, x `notElem` ys ]
这来自set theory的set difference。基本的想法是你正在“减去”另一个元素的集合,因此术语“差异”。
+0
如果我有这样的声明:diff ::(Eq a)=> [a] - > [a] - > [a]我想找出2个列表之间的区别?我应该如何继续? – Madalina 2017-05-11 14:39:58
如何做到这一点没有差异运算符? – matthias 2016-01-01 21:29:37
@matthias您可以将'(\\)'实现为'a \\ b = filter(不是。flip elem b)a'。 – fuz 2016-01-01 21:32:32
对不起还有一件事...你可以写非点免费的吗? – matthias 2016-01-01 22:16:37