如何在Haskell中使用具体数据类型构建递归树?

时间:2014-11-10 23:42:28

标签: haskell recursion tree

我想在Haskell中构建一个树,其中每个节点都有一个具体的数据类型。最终我想构建和使用我自己的,更复杂的类型,但我无法弄清楚如何让下面的玩具示例工作。

我想创建一个整数树,从树干上的较大值开始,当你向下移动到树叶时变小。

data Tree x = Empty | Node x (Tree x) (Tree x) deriving (Show, Read, Eq) 

copyBox :: Int -> Tree x
copyBox x
    | x <= 0 = Node x Empty Empty
    | x > 0  = Node x (copyBox (x-1)) (copyBox (x-1)) 

我希望能够像这样构建一个小树:

let newtree = copyBox 3

ghci抛出错误&#34;无法匹配预期类型&#39; x&#39;实际类型&#39; Int&#39;&#34;在第5行。

如果我用上面更常规的版本替换上面的函数声明,则没有问题:

copyBox :: (Ord x, Num x) => x -> Tree x

为什么不是x的类型&#34; Int&#34;在这两种情况下?

1 个答案:

答案 0 :(得分:5)

copyBox :: Int -> Tree x承诺在来电者的心血来潮之下返回任何类型的树。所以我可以写copyBox 5 :: Tree String,这是一个基于你的类型签名的合法电话。但当然这会失败:你将x放在节点中;并且你试图从中减去1,只有当它是数字类型时才有效;并且你将它与0进行比较,只有当它是有序的类型时才有效...

您可能只想打算copyBox :: Int -> Tree Int,因为您显然只是在其中构建一个带有Int值的树。