Haskell与重复的交集

Yel*_*los 1 haskell

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

我想要的是一个函数,它返回两个列表的"交集":两个列表中存在的元素列表,考虑重复.

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

[1,2,2,2,3,4] `intersect` [6,4,4,2,2] == [2,2,2,4]
Run Code Online (Sandbox Code Playgroud)

这不是我想要的,因为[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]
Run Code Online (Sandbox Code Playgroud)

怎么可以实现呢?

use*_*465 6

一种效率低下的方法是

intersect' xs ys = xs \\ (xs \\ ys)
Run Code Online (Sandbox Code Playgroud)

例如

[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]
Run Code Online (Sandbox Code Playgroud)

[6,4,4,2,2]   \\ [1,2,2,2,3,4] == [6,4]
[6,4,4,2,2]   \\ [6,4]         == [4,2,2]
Run Code Online (Sandbox Code Playgroud)

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

在结果中xs \\ ys,ys依次删除了每个元素的第一次出现(如果有的话)xs.从而

(xs ++ ys) \\ xs == ys.
Run Code Online (Sandbox Code Playgroud)