Haskell: возможное исправление: добавьте (Eq a) в контекст - PullRequest
6 голосов
/ 16 февраля 2011

Я новичок в Haskell, и мне трудно понять, что не так с моим кодом здесь.

Вот что я должен делать:
Рассмотрим следующее определение двоичного дерева

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

Рассмотрим функцию отражения, которая формирует зеркальное отображение двоичного дерева путем замены влево и вправо до конца

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

Напишите функцию areMirrorImages, которая определяет, удовлетворяют ли два двоичных дерева t и u т = отражать вас. Функция не должна создавать новые деревья, поэтому она не должна вызывать отражать или Node; хотя он может использовать Node в шаблонах.

Вот что я написал:

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  

Когда я пытаюсь запустить его, в строке 49 появляется следующая ошибка:
Не удалось вывести (уравнение) из контекста (), возникающего при использовании '=='
Возможное исправление: добавьте (Eq a) в контекст сигнатуры типа для 'areMirrorImages'
В выражении: x == y

Я не понимаю, почему я получаю эту ошибку, и я пытался найти решения в Интернете, но пока ничего не нашел. Спасибо.

Ответы [ 2 ]

15 голосов
/ 16 февраля 2011

В настоящее время ваши двоичные деревья могут содержать любой тип - даже типы, которые нельзя сравнивать с помощью ==. Итак, если вы вызвали areMirrorImages на дереве, содержащем такой тип ... что должно произойти?

Вам нужно установить ограничение на функцию areMirrorImages, чтобы он мог принимать только двоичные деревья и сравнивать содержимое.

Что-то вроде следующего:

areMirrorImages :: Eq a => BinaryTree a -> BinaryTree a -> Bool
5 голосов
/ 16 февраля 2011

В качестве небольшого примечания: часто рекомендуется помещать все «совпадающие» регистры функции сверху, так как это часто упрощает «несовпадающие»:

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  
...