I\'m going through the problems in the Haskell O\'Reilly book. The problem I am working on is
Using the binary tree type that we defined earlier in this chapter
Your code is wrong, on several levels. It looks like you misunderstood algebraic data types.
Tree
is always a Tree
of a specific type - which you called a
in its declaration, and which may be any type (since you didn't constraint it). So heigth
has to take a Tree
of some type - a Tree SomeType
, too. You can and should use the most generic type for SomeType
, i.e. a type variable like a
.Node a (Tree a) (Tree a)
or Empty
- to match against, not against the type as a whole. So height (Node ...)
would match a Node
, height (Empty)
would match a Empty
, and height (Tree ...)
would try to match a constructor named Tree
, but there is none. That's the error message you recieve.==
) with a Constructor. It would actually work if you wrote deriving (Show, Eq)
. But you should use pattern matching to determine if you reached an Empty
Node
, not Empty
- you should add a clause for Empty
.height
- which can, in turn, only return 0 or the max of their childrens' height
, etc ad infinitum. You have to increment the result at each level ;)