Я пытаюсь построить дерево, в котором его дочерние элементы представлены в списке. Каждый из дочерних элементов может быть поддеревом и т. д. Итак, я иду по этому пути —
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. дерево1 не создается. Выдается такая ошибка -
<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)