Arvores - Haskell - Portugal-a-Programar
By dardevil, July 9, 2012 in Haskell
dardevil 0
Gostava que pudessem dar uma vista de olhos neste código para ver se tenho alguma coisa errada.
Então é assim tenho:
Tornar este tipo numa instância das classes Eq e Show.
Eu fiz o seguinte mas não sei se está correto.
iguala :: Tree a -> Tree a -> Bool
iguala Null Null = 0 == 0
iguala (Node a Tree b Tree c) (Node d Tree e Tree f) = a == d && b == e && c == f
iguala _ _ = False
instance Eq Tree a where
(==) = iguala
instance Show Tree a where
shoe(Node esq dir) = (show Node) ++ "/" ++ (show esq) ++ "/" ++ (show dir)
Se virem algo de errado (que é o mais provável) gostava que me corrigissem.
Edited July 9, 2012 by Baderous
Nenhuma delas está totalmente correcta. Na instância de Eq, em 1º lugar tens que dizer que para definir uma Tree a como instância de Eq, então os elementos da árvore têm também de ser instâncias de Eq:
Depois a forma como comparas 2 árvores nulas não faz sentido nenhum, não percebo porque é que para Null ser o mesmo que Null, 0 tem de ser o mesmo que 0. Se ambas são Null então são iguais. Dá True. Depois na comparação de 2 árvores não nulas, os argumentos não estão bem definidos, não se mete Tree b nem Tree c nem nada disso, mete-se uma letra que se sabe que será um Tree a, portanto retira lá os "Tree" dos 2 argumentos.
Na instância de Show, a mesma coisa que referi em primeiro lugar para os elementos da árvore tem de ser feito. Falta também indicar o caso da árvore ser Null. No caso que definiste falta no argumento a variável que identifica a raiz da árvore. Não é "Node", isso é o construtor do tipo.
Obrigado pela ajuda!! Por acaso quando ia a comparar duas árvores não nulas tinha posto esq e dir mas depois pensei que não era correto e coloquei o Tree b e o Tree c.