0

子がリストに表示されるツリーを構築しようとしています。それぞれの子はそれ自体がサブツリーなどである可能性があります。したがって、私はこのように進みます-

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)
4

1 に答える 1

4
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]です。

あなたが望むのは、子供自身がTrees であることです。したがって、使用する必要があります

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

またはプレーン

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

エラーは、に属するいくつかのsubtree1タイプがあるためです(同上)。それからあなたが書くときTree aaNumsubtree2

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

の推論された型tree1Tree (Tree a)( にa属するものについてNum) であり、したがって

83 :: Tree a

しかし、s のNumインスタンスはありませんTree

于 2013-01-15T18:58:05.253 に答える