我是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)
怎么可以实现呢?
一种效率低下的方法是
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)