我正在尝试创建一些函数,这些函数可以在不使用Multiset模块的情况下在Haskell中找到两个多集的并集和交集。我对正常列表中的基本交叉点和联合有了很好的理解,但多重集合似乎让我感到厌烦。到目前为止,我有交叉函数:
setUnique :: (Eq a) => [a] -> [a]
setUnique [] = []
setUnique (x:xs)
| elem x xs = setUnique xs
| otherwise = x : setUnique xs
setIntersect' :: (Eq a) => [a] -> [a]
setIntersect' xs ys = setUnique (xs ++ ys)
我在上面的代码中遇到的问题是我实际上得到的值不是交叉的一部分。例如[1,2,2,3,3,3] [1,2,2] = [3,1,2]
答案 0 :(得分:1)
您获得了所有值,因为
xs ++ ys
包含所有元素([1,2,2,3,3] ++ [1,2,2] = [1,2,2,3,3,3,1,2,2])
和setUnique只是删除附加内容
setUnique [1,2,2,3,3,3,1,2,2] = [3,1,2]
我认为你想在这里使用(++)以外的东西(这是你想要的联盟,你需要写一些东西来交叉)。