Reputation: 3910
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.
Upvotes: 8
Views: 10862
Reputation: 47382
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.
Upvotes: 12