Поскольку ваш else
случай говорит:
unique [] = []
unique (x:xs) = if (fst x) == (snd x) then unique (xs) else <b>x:[]</b>
Таким образом, он говорит, что если fst x
равно не равно snd x
, то мы возвращаем x : []
(или короче[x]
), и мы закончили.Таким образом, не выполняет рекурсию для остальной части списка.
Мы можем решить эту проблему, добавив рекурсию в остальную часть списка, например:
unique [] = []
unique (x:xs) = if fst x == snd x then unique xs else x <b>: unique xs</b>
При этом мы можем использовать фильтр здесь, например:
unique :: Eq a => [(a, a)] -> [(a, a)]
unique = filter <b>(\(x, y) -> x /= y)</b>
или даже короче:
unique :: Eq a => [(a, a)] -> [(a, a)]
unique = filter <b>(uncurry (/=))</b>
Таким образом, мы сохраняем все элементы, для которых первый элемент x
равен не равно второму элементу y
.