Tengo una lista de tuplas a las que quiero aplicar cierta condición. Il parece simple pero estoy atrapado con esto. La lista de tuplas ya está generada

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

Quiero devolver una lista de las mismas tuplas pero cuando una tupla (x1, y1) y (x2, y2) donde x1 == y2 e y1 = x2 y pertenece a la lista solo se devuelve (x1, y1)

Encabezado de mi función

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

Y el resultado esperado debería ser así (de la misma lista)

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

Cualquier indicación, idea o sugerencia es bienvenida.

1
David Edgar 15 feb. 2018 a las 10:05

2 respuestas

La mejor respuesta

Después de intentarlo, se me ocurrió esto:

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

Esto le devolverá [(13,14), (13,15), (11,12), (10,11)] en su caso de prueba, en caso de que el orden importe, puede revertirlo.

Esta solución es sin usar ninguna biblioteca, de lo contrario, puede usar un nubBy como dijo otra persona.

3
Dominik Fleischmann 15 feb. 2018 a las 08:38

Veo que ya ha sido respondido, pero como haskell es muy divertido y siempre hay más soluciones posibles, agregaré una que encontré:

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)
3
Chai 15 feb. 2018 a las 13:41