繁体   English   中英

树的代数数据类型

[英]algebraic data type for tree

我正在尝试建立一棵树,其子代在列表中表示。 每个孩子可能自己都是子树等。所以我走这条路-

data Children a = NoChildren | Cons a (Children a) deriving (Show, Read, Ord, Eq)
data Tree a = EmptyTree | Node a (Children a) deriving (Show, Read, Ord, Eq)

现在我尝试创建这样的树

let subtree1 = Node 67 NoChildren
let subtree2 = Node 86 NoChildren
let tree1 = Node 83 (subtree1 `Cons` (subtree2 `Cons` NoChildren))

它工作正常,直到subtree2。 未创建tree1。 抛出的错误是这样的-

<interactive>:96:15:
    No instance for (Num (Tree Integer))
      arising from the literal `83'
    Possible fix: add an instance declaration for (Num (Tree Integer))
    In the first argument of `Node', namely `83'
    In the expression: Node 81 (subtree1 `Cons` (subtree2 `Cons` NoChildren))
    In an equation for `tree1':
      tree1 = Node 81 (subtree1 `Cons` (subtree2 `Cons` NoChildren))

我完全不了解此错误错误。 为什么抱怨83是字面值。 subtree1和subtree2也有文字,它们很好...

我通过执行以下操作解决了问题

data Tree a = EmptyTree | Node a [Tree a] deriving (Show, Read, Ord, Eq)

flatten [] = []
flatten x:xs = x ++ flatten xs

preorder EmptyTree = []
preorder (Node a []) = [a]
preorder (Node a children) = [a] ++ flatten (map preorder children)
data Children a = NoChildren | Cons a (Children a)

表示您的Children a[a]同构,因此您的

data Tree a = EmptyTree | Node a (Children a)

同构

data List a = Empty | Nonempty a [a]

再次与[a]同构。

您想要的是孩子本身就是Tree ,所以您应该使用

data Children a = NoChildren | Cons (Tree a) (Children a)

或平原

data Tree a = EmptyTree | Node a [Tree a]

该错误是因为subtree1对于属于Num某个a具有Tree a类型( subtree2同上)。 然后当你写

tree1 = Node 83 (subtree1 `Cons` (subtree2 `Cons` NoChildren))

推断出的类型的tree1Tree (Tree a) (对于某些a属于Num ),因此

83 :: Tree a

但是没有TreeNum实例。

暂无
暂无

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

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