Haskell: фильтрация списка кортежей с условием

У меня есть список кортежей, к которым я хочу применить определенное условие. Il выглядит просто, но я застрял в этом. Список кортежей готов.

eg : [(10,11),(11,10),(11,12),(12,11),(13,15),(13,14)]

Я хочу вернуть список тех же кортежей, но когда кортеж (x1, y1) и (x2, y2), где x1 == y2 и y1 = x2 и принадлежит списку, возвращается только (x1, y1)

Заголовок моей функции

myFun :: Ord a => [(a,a)] -> [(a,a)]
    myFun = ....

И ожидаемый результат должен быть таким (из того же списка)

[(10,11),(11,12),(13,15),(13,14)]

Приветствуются любые указания, идеи или подсказки.


person David Edgar    schedule 15.02.2018    source источник
comment
Что ты пробовал?   -  person Willem Van Onsem    schedule 15.02.2018
comment
Отлично, я бы хотел понять больше лямбда-выражений   -  person David Edgar    schedule 15.02.2018
comment
Также возможно: map head $ groupBy (\(x1, y1) (x2, y2) -> x1 == y2 && x2 == y1) xs   -  person RoadRunner    schedule 15.02.2018


Ответы (2)


После некоторых попыток я пришел к следующему:

myFun::Ord a => [(a,a)] -> [(a,a)]
myFun ls = auxfun [] ls

auxfun:: Eq a => [(a,a)] -> [(a,a)] -> [(a,a)]
auxfun [] [] = []
auxfun [] (l:ls) = auxfun [l] ls
auxfun ls [] = ls
auxfun ls1 ((x,y):ls2)
    |(y,x) `elem` ls1 = auxfun ls1 ls2
    |otherwise = auxfun ((x,y):ls1) ls2

Это вернет вам [(13,14), (13,15), (11,12), (10,11)] в вашем тестовом примере, в случае, если порядок имеет значение, вы можете просто отменить его.

Это решение не использует никаких библиотек, иначе вы можете использовать nubBy, как сказал другой человек.

person Dominik Fleischmann    schedule 15.02.2018
comment
Ответ @Alexis King в разделе комментариев выполняет свою работу, но спасибо за ваши усилия, я тоже попробую - person David Edgar; 15.02.2018

Я вижу, что на него уже ответили, но, поскольку haskell - это очень весело и всегда есть больше возможных решений, я добавлю одно, которое я нашел:

foldr (\x y -> if x == rev (head) y then (x:tail y) else x:y) [rev $ last xs] xs where
  rev (a,b) = (b,a)
person Chai    schedule 15.02.2018