es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comparar todos los elementos en una lista en Haskell.

Tengo una lista con elementos que son tuplas ejemplo:

[(1,2),(3,9),(7,9),(6,4),(1,2),(4,2),(3,9),(1,2)]

Necesito comparar el primer elemento con el resto de los elementos, luego el segundo elemento con el resto de la lista, y así sucesivamente para retornar los elementos repetidos.

En este caso debería retornar

(1,2),(1,2),(1,2),(3,9),(3,9)

¿Alguna idea de cómo implementarlo?

Tengo esto implementado

test :: Eq a => [(a,a)] -> [(a,a)]
test [(x,y)] = [(x,y)]
test (x:y:xs)
|((fst (x) == fst (y)) && (snd (x) == snd (y))) = ( [y]) ++ (test (x:xs) )
|otherwise = test (x:xs)

La condición final está mal y siempre retorna el último elemento de la lista
test [(x,y)] = [(x,y)]

Y solo compara el primer elemento con el resto de la lista, pero necesito comparar el segundo, el tercero … con el resto de la lista.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar un enfoque recursivo para comparar cada elemento de la lista con el resto de la lista. Puede usar una función auxiliar para comparar cada elemento de la lista con el resto de la lista y luego devolver los elementos repetidos.

    Aquí hay un ejemplo de cómo se puede implementar:

    compareElements :: Eq a => [(a,a)] -> [(a,a)] -> [(a,a)]
    compareElements [] _ = []
    compareElements (x:xs) ys 
        | elem x ys = x : compareElements xs ys
        | otherwise = compareElements xs ys
    
    test :: Eq a => [(a,a)] -> [(a,a)]
    test [] = []
    test (x:xs) = compareElements (x:xs) xs ++ test xs
    

Comments are closed.