2012-07-31 4 views
10

Ich schrieb den folgenden Code einen polymorphen Binärbaum in Haskell als Vorbereitung für die funktionale Programmierung Prüfung nächste Woche für den Umgang:Haskell Polymorphe Baum Sum

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) 

Jetzt habe ich das Problem, dass der Code nicht Kompilieren:

...\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> 

Wissen Sie, was mit treeSum nicht stimmt? Ich denke, es hat etwas mit dem polymorphen Typ von ITree zu tun, aber ich weiß nicht, wie ich das lösen soll. Muss ich angeben, dass der Typ t ein Typ sein muss, der gezählt/nummeriert werden kann? Wahrscheinlich mit einer Klasseninstanz einer solchen Typklasse?

Vielen Dank im Voraus für Ihre Hilfe!

Simon

+4

Was sollte 'treeSum (Knoten" marshmellow "Leaf Leaf) sein? – dave4420

+0

Es gibt keine Notwendigkeit :) Aber für Floats! – saimn

+3

Richtig, aber der Typ, den du für 'treeSum' gibst, verspricht, dass es für jeden Typ' t', sogar 'String' funktioniert. – dave4420

Antwort

11

Der Compiler kann nicht überprüfen, ob das Ergebnis ein Int sein wird. So wie es steht, könnten Sie treeSum mit einem ITree Integer Argument aufrufen (und die Operationen würden kein Int produzieren).

Versuchen Sie, die Signatur in treeSum :: Integral t => ITree t -> t zu ändern.

+0

Danke, das hat das Problem gelöst? Was sagt Integral? Ist es eine Typklasse oder eine Konvertierung/Typisierung? – saimn

+4

'treeSum :: Num t => ITree t -> t' wäre besser: es verwendet nur 'fromInteger'und' (+) '. – dave4420

+2

@saimn Es ist eine Einschränkung, die besagt, dass "t" ein Typ sein muss, der die Typklasse "Integral" implementiert. – dave4420