2014-11-05 3 views
1

Я очень новичок в Haskell, и я пытаюсь обернуть голову вокруг синтаксиса (а также привыкнуть к декларативному языку). Я создал тип данных дерева, и я хочу иметь возможность сравнивать их с помощью оператора ==. Вот что у меня есть:Оператор равенства деревьев в Haskell

data Tree = 
    Leaf 
    | Twig 
    | Branch Tree Tree Tree 
    deriving Show; 

instance Eq Tree where 
    Leaf == Leaf = True; 
    (Branch a b c) == (Branch a1 b1 c1) = a==a1 && b==b1 && c==c1; 

Это, кажется, работает при вводе: Leaf == Leaf или Branch Leaf Leaf Leaf == Branch Leaf Leaf Leaf, но он продолжает давать мне ошибку, когда я добавляю Twig == Twig = True;. Кроме того, нет способа сравнить Leaf == Branch Leaf Leaf Leaf. Я пробовал использовать _==_ = False;, но это также дало мне ошибку. Я потерян, любая помощь будет принята с благодарностью!

EDIT: все еще получаю ошибки, а именно:

[1 of 1] Compiling Main    (Tree.hs, interpreted) 

Tree.hs:15:5: parse error on input ‘_’ 
Failed, modules loaded: none. 
Prelude> :r 
[1 of 1] Compiling Main    (Tree.hs, interpreted) 

Tree.hs:15:3: parse error on input ‘Twig’ 
Failed, modules loaded: none. 

Во-первых, после того, как я вынимаю проблемное Twig ==, оставляя _ == _. Второй уходят как в.

+4

Если вы публикуете точный код, вызывающий ошибки, вы, вероятно, получите объяснение, что происходит не так. –

ответ

6

Ваш код работает для меня вещи добавили, что вы сказали, дали ошибку, в частности

instance Eq Tree where 
    Leaf == Leaf = True; 
    (Branch a b c) == (Branch a1 b1 c1) = a==a1 && b==b1 && c==c1; 
    Twig == Twig = True; 
    _ == _ = False; 

(BTW ; в конце линии является излишним.)

Я подозреваю, что у вас может быть ошибка с отступом. Вы смешиваете вкладки и пробелы?

Кроме того, все этот экземпляр декларации просто эквивалентна смена положения deriving на

deriving (Show,Eq) 

, как именно и по умолчанию, полученным Eq экземпляр работает.

+1

В Haskell wikibook есть [хороший раздел по отступу и правилу макета] (http://en.wikibooks.org/wiki/Haskell/Indentation), который может найти полезный вопросник. В частности, он проходит через преобразование в одномерный стиль с запятой и из нее. –

Смежные вопросы