Cnr*_*nrL 0 tree recursion haskell
我想在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))
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样构建一个小树:
let newtree = copyBox 3
Run Code Online (Sandbox Code Playgroud)
ghci在第5行抛出错误"无法将预期类型'x'与实际类型'Int'匹配".
如果我用上面的更通用版本替换上面的函数声明,则没有问题:
copyBox :: (Ord x, Num x) => x -> Tree x
Run Code Online (Sandbox Code Playgroud)
为什么两种情况下x的类型都不是"Int"?
copyBox :: Int -> Tree x承诺在呼叫者的心血来潮之下返回任何类型的树.所以我可以写copyBox 5 :: Tree String,这是一个基于你的类型签名的合法电话.但是当然这会失败:你正在x加入节点; 并且你试图从中减去1,只有当它是数字类型时才有效; 并且你将它与0进行比较,只有当它是有序类型时才有效...
您可能只是打算copyBox :: Int -> Tree Int,因为您显然只在其中构建具有Int值的树.