我是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]
如何实现这一目标?
答案 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.