似乎无法理解“列表差异”(\\)运算符

时间:2011-05-29 13:16:51

标签: list haskell element set-difference

我在Haskell中听过“list difference”(\\)运算符这个术语,但仍然不太清楚如何理解它。任何例子或想法?

4 个答案:

答案 0 :(得分:9)

(\\) operator(和the difference function)实施set difference,因此,如果您有两个列表ab,则只返回不在a中的b,如图所示:

enter image description here

答案 1 :(得分:8)

简单地说,它需要两个列表,遍历第二个列表,对于每个项目,从第一个列表中删除相同项目的第一个实例。

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

答案 2 :(得分:2)

xs \\ ysxs中不在ys中的所有元素。也许列表理解会澄清这一点:

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

或者,如果您可以在Haskell中执行此操作,

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

这来自set theoryset difference。基本思想是你从另一个元素中“减去”一个元素集合,因此称为“差异”。

答案 3 :(得分: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"]