2014-12-06 72 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.