8

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.

2
  • 1
    Please add the details of the error messages you are getting and what you've tried to fix them. Commented Jan 18, 2014 at 8:52
  • 2
    Since you are comparing the objects inside the tree, they must be members of the Ord typeclass. The type of < is Ord a => a -> a -> Bool. The correct type for your function would be Ord a => Tree a -> a -> Tree a. Commented Jan 18, 2014 at 8:59

1 Answer 1

12

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Hi Chris, thanks a lot, but it's actually tinsert :: (Ord a) =》 Tree a -> a -> Tree a. I fixed it. Thanks for the info.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.