Удаление кортежей с одинаковой парой значений из списка - PullRequest
0 голосов
/ 27 января 2019

Я хочу удалить все кортежи с одинаковой парой значений, например, [(1,1), (2,3), (2,2), (3,4)] Я хочу [(2, 3), (3, 4)].Я работаю в Хаскеле.Вот что я попробовал:

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

И вывод был:

[(2,3)]

Я не понимаю, почему (3, 4) не появилось.

1 Ответ

0 голосов
/ 27 января 2019

Поскольку ваш 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.

...