Haskell与重复的交集

时间:2014-12-06 14:43:40

标签: haskell

我是Haskell的新手,这必须非常简单,但我一直在网上搜索一个小时而没有找到方便的答案。

我想要的是一个能够返回交叉点的功能。两个列表:两个列表中存在的元素列表,考虑重复。

我认为函数intersect将是我想要的,但正如文档中所述,如果第一个列表包含重复项,那么结果也是如此。 E.g:

[1,2,2,2,3,4] `intersect` [6,4,4,2,2] == [2,2,2,4]

这不是我想要的,因为[2,2,2,4]不是[6,4,4,2,2]的一部分,因为那里只有两个2?名单。我想要的结果是:

[1,2,2,2,3,4] `intersect` [6,4,4,2,2] == [2,2,4]

如何实现这一目标?

1 个答案:

答案 0 :(得分:6)

一种效率低下的方法是

intersect' xs ys = xs \\ (xs \\ ys)

例如

[1,2,2,2,3,4] \\ [6,4,4,2,2]   == [1,2,3]
[1,2,2,2,3,4] \\ [1,2,3]       == [2,2,4]

[6,4,4,2,2]   \\ [1,2,2,2,3,4] == [6,4]
[6,4,4,2,2]   \\ [6,4]         == [4,2,2]

来自http://hackage.haskell.org/package/base-4.7.0.1/docs/Data-List.html

xs \\ ys的结果中,ys的每个元素的第一次出现(如果有的话)已从xs中删除。因此

(xs ++ ys) \\ xs == ys.