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.
2 respuestas
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.
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)
Preguntas relacionadas
Nuevas preguntas
haskell
Haskell es un lenguaje de programación funcional que ofrece una tipificación estática fuerte, una evaluación diferida, un amplio soporte de paralelismo y concurrencia, y capacidades de abstracción únicas.