2011-07-07 13 views
6

Capítulo 3 define el siguiente tipo recursivo para representar un árbol binario:Real World Haskell Capítulo 3 ejercicio: Árbol Binario con 1 constructor de datos

data Tree a = Node a (Tree a) (Tree a) 
      | Empty 
       deriving (Show) 

El ejercicio requiere implemento del mismo tipo utilizando un constructor único valor, utilizando el tipo "Tal vez" para referirse a los nodos secundarios:

(del Capítulo 3 Ejercicio 2 en la página 60)

"definir un tipo de árbol que tiene un solo constructor, como nuestro ejemplo de Java en lugar del vacío. constructor, use el tipo Maybe para referirse r a los hijos de un nodo ".

La solución que se me ocurrió es la siguiente:

data AltTree a = AltNode a (Maybe (AltTree a)) (Maybe (AltTree a)) 
       deriving (Show) 

Sin embargo, esto no permite un árbol que contiene otros árboles vacíos, tales como:

AltNode 1 (AltNode 2 Nothing Nothing) (AltNode 3 Nothing Nothing) 

y no estoy ¿Por qué, "Nothing" no es un constructor de valor para el tipo "Maybe"?

+0

línea: [RWH> Capítulo 3 Ejercicios>] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id585938) –

Respuesta

5

No es el Nothing constructor de valores que causa su error. Las dos ramas que pasa al árbol de nivel superior deben tener el tipo Maybe (AltTree a), pero tanto (AltNode 2 Nothing Nothing) como (AltNode 3 Nothing Nothing) tienen el tipo AltTree Int. Tienes que usar Just constructor de valor para crear valores de Maybe tipo de ellos. Al igual que

AltNode 1 (Just (AltNode 2 Nothing Nothing)) (Just (AltNode 3 Nothing Nothing)) 
+3

@rr Además, la solución es incompleto: no tiene equivalente para 'Vaciar'. Debes permitir 'AltNode Nothing Nothing Nothing'. Eso todavía no es del todo correcto, porque ahora el sistema de tipos puede permitir nodos vacíos que tienen hijos. Quizás envolver todos los argumentos en una tupla Maybe será semánticamente mejor? –

+0

@Matajon, gracias por la explicación, eso tiene sentido ahora. ¿Pero esto no hace que el tipo sea diferente de la implementación que dan en el libro? O tal vez estoy leyendo esto demasiado. –

+0

@Thomas M. DuBuisson Es un buen punto, no estoy del todo seguro, tendré que jugar con eso. Gracias. –

Cuestiones relacionadas