Сумма полиморфного дерева Haskell

Я написал следующий код для обработки полиморфного двоичного дерева в Haskell в качестве предварительного экзамена по функциональному программированию на следующей неделе:

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)

Теперь у меня есть проблема, что код не компилируется:

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

Знаете ли вы, что случилось с treeSum? Я думаю, что это имеет какое-то отношение к полиморфному типу ITree, но я не знаю, как это решить. Должен ли я указывать, что тип t должен быть типом, который можно подсчитать/перечислить? Возможно, с экземпляром класса такого типа?

Заранее благодарим за помощь!

Саймон

Ответ 1

Компилятор не может проверить, что результат будет Int. Как бы то ни было, вы можете вызвать treeSum с аргументом ITree Integer (а операции не будут иметь Int).

Попробуйте изменить подпись на treeSum :: Integral t => ITree t -> t.