2014-01-18 5 views
4

Я реализует функцию вставки BST, ниже мой код:реализации бинарной вставки дерева поиска в Haskell

data Tree a = Empty | Branch a (Tree a) (Tree a) 
    deriving (Show, Eq) 

tinsert    :: Tree a -> a -> Tree a 
tinsert Empty a   = Branch a Empty Empty 
tinsert (Branch a left right) b 
    | b == a = Branch a left right 
    | b < a = Branch a (tinsert left b) right 
    | b > a = Branch a left (tinsert right b) 

Когда я загружал эту функцию в GHCI, он дал мне много ошибок, которые кажутся быть связанными с сравнительными частями. Я не вижу никаких проблем с этим. Я новичок в Haskell, может ли кто-нибудь помочь? Большое спасибо.

+1

Пожалуйста, добавьте информацию об ошибках, которые вы получаете, и о том, что вы пытались их исправить. –

+2

Поскольку вы сравниваете объекты внутри дерева, они должны быть членами класса «Ord». Тип '' '' 'Ord a => a -> a -> Bool'. Правильным типом для вашей функции будет «Ord a => Tree a -> a -> Tree a'. – user2407038

ответ

8

Изменение типа tinsert в

tinsert :: (Ord a) => Tree a -> a -> Tree a 

фиксирует это.

Это необходимо, потому что функции (<) и (>) - это номера классов Ord, и вам нужно иметь до этого в типе подпись.

Вы также можете использовать == и (==) :: Eq a => a -> a -> Bool, но Eq является суперкласс Ord, так что компилятор знает, что если у вас есть (<) доступные у вас уже есть ==, так что вам не нужно говорить Eq a, а также.

+2

Привет Крис, спасибо большое, но это на самом деле tinsert :: (Ord a) = "Tree a -> a -> Tree a. Я починил это. Спасибо за информацию. –

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