我下周在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必须是可以计数/枚举的类型?可能带有此类类型的类实例?

在此先感谢您的帮助!

西蒙

最佳答案

编译器无法验证结果是否为Int。就目前而言,您可以使用treeSum参数调用ITree Integer(并且该操作不会产生Int)。

尝试将签名更改为treeSum :: Integral t => ITree t -> t

关于Haskell多态树总和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11742405/

10-11 08:40