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