Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Beginning Haskell - getting "not in scope: data constructor" error

Tags:

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,  write a function that will determine the height of the tree. The height  is the largest number of hops from the root to an Empty. For example, the  tree Empty has height zero; Node "x" Empty Empty has height one;  Node "x" Empty (Node "y" Empty Empty) has height two; and so on. 

I'm writing my code in a file called ch3.hs. Here's my code:

36 data Tree a = Node a (Tree a) (Tree a) 37             | Empty 38               deriving (Show) 39 40 --problem 9:Determine the height of a tree 41 height :: Tree -> Int 42 height (Tree node left right) = if (left == Empty && right == Empty) then 0 else max (height left) (height right)  

opening ghci in the terminal and typing :load ch3.hs. When I do that I get the following error:

Prelude> :load ch3.hs [1 of 1] Compiling Main             ( ch3.hs, interpreted )  ch3.hs:42:7: Not in scope: data constructor `Tree' Failed, modules loaded: none. 

I expect that the Tree data constructor should be there, because I defined it in the lines above the height method. But when I try to load the file, I'm told that the data constructor is not in scope. I appreciate your help and explanation of why this error occurs. Thanks, Kevin

like image 440
Kevin Burke Avatar asked Aug 28 '10 19:08

Kevin Burke


1 Answers

Change

height (Tree node left right)  

to

height (Node node left right) 

That means the pattern matching works on the constructors of the algebraic data type (ADT). Tree is not a constructor, it is the name of the ADT.

Btw, you have to comment out your function signature declaration to compile the code because it contains an error.

You can then check the inferred type via

 :t height 

in ghci or hugs.

like image 154
maxschlepzig Avatar answered Sep 18 '22 01:09

maxschlepzig