2014-12-06 71 views
1

我是新来的Haskell,这一定很简单,但我一直在网上搜索一个小时,没有找到一个方便的答案。哈斯克尔路口与重复

我想要的是一个返回两个列表的“交集”的函数:列表中存在两个列表中的元素,并考虑到重复项。

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

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

这怎么可能完成?

回答

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来自:

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

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