2012-07-31 16 views
10

me escribió el siguiente código para el manejo de un árbol binario polimórficos en Haskell como una preparacion para el examen de la programación funcional de la próxima semana:Haskell polimórfica árbol Suma

data ITree t = Leaf | Node t (ITree t) (ITree t) 
      deriving (Eq, Ord, Show) 

treeSum :: ITree t -> Int 
treeSum Leaf = 0 
treeSum (Node n t1 t2) = n + (treeSum t1) + (treeSum t2) 

Ahora tengo el problema, que el código no hace compila:

...\tree.hs:8:26: 
Couldn't match type `t' with `Int' 
    `t' is a rigid type variable bound by 
     the type signature for treeSum :: ITree t -> Int 
     at ...\tree.hs:7:1 
In the first argument of `(+)', namely `n' 
In the first argument of `(+)', namely `n + (treeSum t1)' 
In the expression: n + (treeSum t1) + (treeSum t2) 
Failed, modules loaded: none. 
Prelude> 

¿Sabes qué le pasa a treeSum? Creo que tiene algo que ver con el tipo polimórfico de ITree, pero no sé cómo resolverlo. ¿Debo especificar que el tipo t debe ser un tipo que se puede contar/enumerar? ¿Probablemente con una instancia de clase de tal tipo?

Gracias de antemano por su ayuda!

Simon

+4

¿Qué debería 'treeSum (Node" marshmellow "Leaf Leaf)' be? – dave4420

+0

No hay necesidad de eso :) ¡Pero para Floats! – saimn

+3

Correcto, pero el tipo que das para 'treeSum' promete que funciona para cualquier tipo' t', incluso 'String'. – dave4420

Respuesta

11

El compilador no puede verificar que el resultado será una Int. Tal como está, puede llamar al treeSum con un argumento ITree Integer (y las operaciones no generarán un Int).

Intente cambiar la firma a treeSum :: Integral t => ITree t -> t.

+0

Gracias, esto resolvió el problema? ¿Qué dice Integral t? ¿Es una clase de tipo o una conversión/conversión de tipo? – saimn

+4

'treeSum :: Num t => ITree t -> t' sería mejor: solo usa' fromInteger'and '(+)'. – dave4420

+2

@saimn Es una restricción que dice 't' debe ser un tipo que implementa la clase de tipo' Integral'. – dave4420