Я довольно новичок в Haskell, и я пытаюсь разобраться, как пройти n-арное дерево. Как выход я ищу, чтобы получить список значений листьев (как ветви не имеют значения), поэтому для testtree это было бы: 4,5Haskell n-ary tree traversal
Мое определение до сих пор:
data Tree a = Leaf a | Branch [Tree a] deriving (Show)
travTree :: Tree a -> [a]
travTree (Leaf x) = [x]
travTree (Branch (x:xs)) = travTree x : travTree xs
testtree = Branch [(Leaf "4"), (Leaf "5")]
Но он выдает ошибку:
Couldn't match expected type `Tree a'
against inferred type `[Tree a]'
In the first argument of `travTree', namely `xs'
In the second argument of `(:)', namely `travTree xs'
In the expression: travTree x : travTree xs
Я предполагаю, что это связано с хз быть список деревьев и его ожидает исключительный дерево. Есть ли способ сделать это? Я пытался функцию карты, вдоль линий:
travTree (Branch (x:xs)) = travTree x : map travTree xs
Но потом жалуется:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `travTree'
Я также попытался изменить функцию подписи:
travTree :: Tree a -> [b]
Что дает ошибку:
Couldn't match expected type `a' against inferred type `[b]'
`a' is a rigid type variable bound by
the type signature for `travTree' at Main.hs:149:36
In the first argument of `(:)', namely `travTree x'
In the expression: travTree x : map travTree xs
In the definition of `travTree':
travTree (Branch (x : xs)) = travTree x : map travTree xs
Любая помощь будет принята с благодарностью, поэтому заранее спасибо ..!
Ваш первый ответ с пониманием списка был прекрасным ... но приятно видеть, что вы согласны с моим ответом тоже! – Nefrubyr
вы также можете использовать concatMap;) – hiena
Мне нравится это решение, так как оно немного сломается. Я согласен, это яснее, чем функция concatMap. Мне также понравилось понимание списка (хотя изначально немного сложнее понять), поэтому еще раз спасибо! :-) – Matt