我想删除所有具有相同值对的元组,例如[(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)
感到困惑。
答案 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
不相等的所有元素。