从列表中删除具有相同值对的元组

时间:2019-01-27 18:04:50

标签: haskell functional-programming tuples

我想删除所有具有相同值对的元组,例如[(1,1), (2,3), (2,2), (3,4)]我要[(2, 3), (3, 4)]。我在Haskell工作。这是我尝试过的:

unique [] = []
unique (x:xs) = if (fst x) == (snd x) then unique (xs) else x:[]

输出为:

[(2,3)]

我对为什么没有出现(3, 4)感到困惑。

1 个答案:

答案 0 :(得分:8)

因为您的else案中说:

unique [] = []
unique (x:xs) = if (fst x) == (snd x) then unique (xs) else x:[]

因此,如果fst x不等于snd x,则返回x : [](或更短的[x]),完成。因此,它对列表的其余部分不执行递归。

我们可以通过在列表的其余部分添加递归来解决此问题,例如:

unique [] = []
unique (x:xs) = if fst x == snd x then unique xs else x : unique xs

话虽如此,我们可以在这里使用过滤器,例如:

unique :: Eq a => [(a, a)] -> [(a, a)]
unique = filter (\(x, y) -> x /= y)

或更短:

unique :: Eq a => [(a, a)] -> [(a, a)]
unique = filter (uncurry (/=))

因此,我们保留第一个元素x与第二个元素y不相等的所有元素。