Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

implementing binary search tree insertion in Haskell

I'm implementing the insert function of a BST, below is my code:

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)

When I was loading this function in ghci, it gave me many errors, which seem to be related to the comparison parts. I don't see any problem with it. I'm new to Haskell, could anybody help? Thanks a lot.

like image 532
J Freebird Avatar asked Jan 18 '14 08:01

J Freebird


1 Answers

Changing the type of tinsert to

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

fixes it.

This is necessary because the functions (<) and (>) are from the Ord typeclass, and you need to own up to that in the type signature.

You also use == and (==) :: Eq a => a -> a -> Bool, but Eq is a superclass of Ord, so the compiler knows that if you have (<) available you already have ==, so you don't need to say Eq a as well.

like image 62
3 revs, 3 users 57% Avatar answered Oct 30 '22 20:10

3 revs, 3 users 57%