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.

Instancia del tipo de dato Haskell como operador.

He recibido un ejercicio para aprender sobre tipos de datos en Haskell y no puedo encontrar la forma de resolver este.

Me dieron un dato como: data CatLista a = Nil | Unit a| Conc (CatLista a) (CatLista a) deriving Eq y necesito hacer que los tipos de datos sean: Nil -> [], Unit x -> [x], Conc -> mismo operador que (++).

Entonces, si ejecutas Conc (Unit 9)(Conc (Unit 5) (Unit 3)) == Conc (Conc (Unit 9) (Unit 5))(Conc (Unit 3) Nil) debería dar verdadero y Conc (Unit 9)(Unit 3) == Conc (Unit 3) (Unit 9) debería dar falso.

Ya intenté instanciar la clase Show de esta manera:

instance Show a => Show (CatLista a) where
    show a = case a of
        Nil -> []
        Unit x -> "[" ++ show x ++ "]"
        Conc Nil dos -> show dos
        Conc uno Nil -> show uno 
        Conc uno dos -> "[" + show uno ++ "," ++ show dos ++ "]"

Soy bastante nuevo en Haskell, por lo que es posible que no conozca algunos conceptos básicos, ya que no entiendo por qué si lo ejecuto (siendo Conc uno dos -> show uno ++ show dos) con el mismo comando que abajo Conc (Unit 9)(Conc (Unit 5) (Unit 3)) == Conc (Conc (Unit 9) (Unit 5))(Conc (Unit 3) Nil) aún devuelve False, aunque ambos devuelven el mismo [9][5][3] con mi instancia de Show.

EDIT

Gracias a ustedes lo logré, ahora devuelve correctamente los valores como se pretendía con este código:

toLista :: Eq a => CatLista a -> [a]
toLista Nil = []
toLista (Unit x) = [x]
toLista (Conc a b) 
                    | a == Nil = toLista b 
                    | b == Nil = toLista a
                    | otherwise = (++) (toLista a) (toLista b)

instance (Show a,(Eq a)) => Show (CatLista a) where 
    show a= show (toLista a)

Pero todavía no sé por qué si intento la misma comparación aún devuelve False, aunque obtengo el mismo [9,5,3].

Esto probablemente se deba a mi falta de conocimiento en Haskell, lo siento por eso.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para convertir el tipo de dato en Nil -> [], Unit x -> [x], y Conc -> mismo operador que (++), puedes definir una función toLista que tome una CatLista a y devuelva una lista [a]. Aquí tienes una implementación de toLista:

    toLista :: Eq a => CatLista a -> [a]
    toLista Nil = []
    toLista (Unit x) = [x]
    toLista (Conc a b) = toLista a ++ toLista b
    

    Esta función recorre recursivamente la CatLista a y construye la lista correspondiente.

    Para usar esta función, necesitas actualizar tu instancia de Show:

    instance (Show a, Eq a) => Show (CatLista a) where
      show a = show (toLista a)
    

    Ahora deberías poder comparar valores de CatLista a usando == y obtener los resultados esperados.

Comments are closed.