繁体   English   中英

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

[英]How can I build a recursive tree with concrete data types in 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)) 

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

let newtree = copyBox 3

ghci在第5行引发错误“无法将预期的类型'x'与实际的类型'Int'匹配”。

如果我将下面的函数声明替换为下面的更通用的版本,则没有问题:

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

为什么在两种情况下x的类型都不都是“ Int”?

copyBox :: Int -> Tree x承诺会根据调用者的想法立即返回任何类型的Tree。 因此,我可以编写copyBox 5 :: Tree String ,这是基于您的类型签名的合法调用。 但是,这当然会失败:您将x放入节点; 并且您正在尝试从中减去1,仅在数字类型时才有效; 并且您正在将它与0进行比较,仅在它是有序类型时才有效...

您可能只打算使用copyBox :: Int -> Tree Int ,因为您显然仅在其中构建具有Int值的Tree。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM