I wrote the following code for handling a polymorphic binary tree in Haskell as a preperation for the functional programming exam next week:
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)
Now I have the problem, that the code doesn't compile:
...\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>
Do you know what's wrong with treeSum? I think it has something to do with the polymorphic type of ITree, but I don't know how to solve this. Do I have to specify that the type t must be a type which can be counted/enumerated? Probably with a class instance of such a type class?
Thanks in advance for your help!
Simon
The compiler can't verify that the outcome will be an Int. As it stands, you could call treeSum with an ITree Integer argument (and the operations wouldn't produce an Int).
Try changing the signature to treeSum :: Integral t => ITree t -> t.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With