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.
davy.ai
Para convertir el tipo de dato en
Nil -> []
,Unit x -> [x]
, yConc -> mismo operador que (++)
, puedes definir una funcióntoLista
que tome unaCatLista a
y devuelva una lista[a]
. Aquí tienes una implementación detoLista
:Esta función recorre recursivamente la
CatLista a
y construye la lista correspondiente.Para usar esta función, necesitas actualizar tu instancia de
Show
:Ahora deberías poder comparar valores de
CatLista a
usando==
y obtener los resultados esperados.