Estoy repasando los problemas del libro de Haskell O'Reilly. El problema que estoy trabajando esBeginning Haskell - Obteniendo el error "no en alcance: constructor de datos"
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.
estoy escribiendo mi código en un archivo llamado ch3.hs. Aquí está mi código:
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)
abriendo ghci en la terminal y escribiendo: load ch3.hs. Cuando lo hago me sale el siguiente 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.
espero que el constructor de datos de árbol debe estar allí, porque la he definido en las líneas anteriores el método de altura. Pero cuando intento cargar el archivo, me dicen que el constructor de datos no está dentro del alcance. Agradezco su ayuda y la explicación de por qué ocurre este error. Gracias, Kevin
Gracias, que trabajado. Todavía no entiendo completamente lo que está pasando, y ahora recibo errores en tiempo de ejecución, pero seguiré mirando y pensando y depurando. –
Otro ejemplo puede hacer que sea más fácil de entender. Imaginemos que estamos trabajando con enteros, no con árboles. Int es el nombre del tipo entero. No puede agregar "Int + Int" porque Int es el nombre del tipo, no un constructor que devuelve un valor de ese tipo. Cosas como 0, 1, 2, ... son los constructores, y si quieres trabajar con enteros, así es como los consigues en tu programa. Aplicando esto a su caso, 'Tree' es el nombre del tipo, y' Node' (o 'Empty') es la forma en que obtiene un * * de ese tipo. El – jrockway
HaskellWiki también tiene una sección útil, e incluso se utiliza como árbol del ejemplo: http://www.haskell.org/haskellwiki/Constructor – jrockway