如何使用列表推导式计算两个列表的对称差集?

3

要获得两个列表的对称差,我认为使用列表推导式是一个好主意。但我不知道该如何去除列表中共同的元素,并获取不同的元素。

例如

symDiff [1,2,3,4] [1,3,5]  -- should return [2,4,5].

到目前为止,我已经

symDiff :: [a] -> [a] -> [a]
symDiff xs ys = 

1
你尝试了什么?提示:使用filter - Willem Van Onsem
由于没有尝试,投票关闭。https://stackoverflow.com/help/how-to-ask - user1198582
@Willem Van Onsem 谢谢。我会尝试的。 - Kilmix
如果列表中有重复项,应该发生什么? - dfeuer
symmdif a b = (dif a b)?可能不是。symmdif a b = (dif b a)?也不太可能。symmdif a b = one ++ two where ....,也许是这样?那么onetwo是什么? - Will Ness
1个回答

2

希望这能有所帮助,但是我无法在不使用Eq a的情况下完成。

symDiff :: Eq a => [a] -> [a] -> [a]
symDiff setA setB = [c | c <- setA, not $ (elem c [x | x <- setB])]
                        ++ [c | c <- setB, not $ (elem c [x | x <- setA])]

对于

symDiff [1,2,3,4] [1,3,5]

将返回:[2,4,5]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接