我想在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;在这两种情况下?
答案 0 :(得分:5)
copyBox :: Int -> Tree x
承诺在来电者的心血来潮之下返回任何类型的树。所以我可以写copyBox 5 :: Tree String
,这是一个基于你的类型签名的合法电话。但当然这会失败:你将x
放在节点中;并且你试图从中减去1,只有当它是数字类型时才有效;并且你将它与0进行比较,只有当它是有序的类型时才有效...
您可能只想打算copyBox :: Int -> Tree Int
,因为您显然只是在其中构建一个带有Int值的树。