2011-02-16 4 views
6

Je suis un peu nouveau à Haskell et j'ai du mal à comprendre ce qui ne va pas avec mon code ici.Haskell: Correctif possible: ajouter (Eq a) au contexte de

Voici ce que je suis censé faire:
par la définition suivante d'un arbre binaire

data BinaryTree a = Empty | Node a (BinaryTree a) (BinaryTree a) 

On considère la fonction reflète qui forme l'image miroir d'un arbre binaire par gauche et droite échangeant des tout le long

reflect :: BinaryTree a -> BinaryTree a 
reflect Empty = Empty 
reflect (Node x l r) = Node x (reflect r) (reflect l) 

Ecrit une fonction areMirrorImages qui détermine si deux arbres binaires t et u satisfont t = reflète u. La fonction ne devrait pas construire de nouveaux arbres, elle ne devrait donc pas appeler reflect ou Node; Bien qu'il puisse utiliser Node dans les modèles.

Voici ce que j'ai écrit:

areMirrorImages :: BinaryTree a -> BinaryTree a -> Bool 
areMirrorImages Empty Empty = True 
areMirrorImages (Node _ _ _) Empty = False 
areMirrorImages Empty (Node _ _ _) = False 
areMirrorImages (Node x l r) (Node y ll rr) 
    | x==y = ((areMirrorImages l rr) && (areMirrorImages r ll)) 
    | otherwise = False 

Lorsque je tente de l'exécuter, j'obtiens l'erreur suivante sur la ligne 49:
Impossible déduire (Eq a) du contexte() résultant d'une utilisation de '=='
solution possible: ajouter (Eq a) dans le contexte de la signature de type pour 'areMirrorImages'
Dans l'expression: x == y

I Je suis confus quant à pourquoi je reçois cette erreur et j'ai essayé de trouver des solutions en ligne, mais je n'ai rien trouvé jusqu'à présent. Merci.

Répondre

15

À l'heure actuelle, vos arbres binaires peuvent contenir n'importe quel type - même les types qui ne peuvent pas être comparés en utilisant ==. Donc, si vous avez appelé areMirrorImages sur un arbre contenant un tel type ... que devrait-il se passer?

Ce que vous devez faire est de placer une contrainte la fonction areMirrorImages, de sorte qu'il ne peut accepter que des arbres binaires qu'il peut comparer le contenu.

Quelque chose comme ce qui suit:

areMirrorImages :: Eq a => BinaryTree a -> BinaryTree a -> Bool 
+0

OK, cela a du sens. Merci beaucoup de m'avoir aidé à comprendre cela! – Gus

5

Tout comme une petite note de côté: Il est souvent une bonne idée de mettre tous les « correspondant à » cas d'une fonction en haut, car cela simplifie souvent le « non correspondant à ceux:

areMirrorImages :: Eq a => BinaryTree a -> BinaryTree a -> Bool 
areMirrorImages Empty Empty = True 
areMirrorImages (Node x l r) (Node y ll rr) = 
    and [x==y, areMirrorImages l rr, areMirrorImages r ll] 
areMirrorImages _ _ = False