Suma del árbol polimórfico de Haskell

Escribí el siguiente código para manejar un árbol binario polimórfico en Haskell como preparación para el examen de programación funcional de la próxima semana:

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 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 lo que está mal con treeSum? Creo que tiene algo que ver con el tipo polimórfico de ITree, pero no sé cómo solucionarlo. ¿Tengo que especificar que el tipo t debe ser un tipo que se pueda contar/enumerar? ¿Probablemente con una instancia de clase de tal clase de tipo?

¡Gracias de antemano por tu ayuda!

Simon

preguntado el 31 de julio de 12 a las 15:07

Que debería treeSum (Node "marshmellow" Leaf Leaf) ¿ser? -

No hay necesidad de eso :) ¡Pero para flotadores! -

Correcto, pero el tipo que das para treeSum promete que funciona para cualquier tipo t, Incluso String. -

Simplemente elimine la firma de tipo para treeSum y luego pregúntele al compilador cuál es el tipo. -

1 Respuestas

El compilador no puede verificar que el resultado será un Int. Tal como está, podrías llamar treeSum con una ITree Integer argumento (y las operaciones no producirían un Int).

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

Respondido 31 Jul 12, 15:07

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

treeSum :: Num t => ITree t -> t seria mejor: solo usa fromIntegery (+). - dave4420

@saimn Es una restricción que dice t debe ser un tipo que implemente el Integral clase de tipo. - dave4420

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.