Sono abbastanza nuovo per Haskell e sto cercando di capire come attraversare un albero n-ary. Come uscita Sto cercando di ottenere un elenco di valori Leaf (come i rami non hanno alcun valore), quindi per testtree questo sarebbe: 4,5Haskell n-ary tree traversal
La mia definizione finora è:
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")]
Ma dà l'errore:
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
sto assumendo questo è dovuto al xs essere un elenco di alberi e la sua attesa di un albero singolare. C'è un modo per fare questo? Ho provato la funzione di carta, seguendo le linee di:
travTree (Branch (x:xs)) = travTree x : map travTree xs
Ma lamenta poi di:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `travTree'
Ho anche provato a cambiare la firma funzione:
travTree :: Tree a -> [b]
che dà l'errore:
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
Qualsiasi aiuto sarebbe molto apprezzato, quindi grazie in anticipo ..!
La tua prima risposta con la comprensione della lista è stata perfettamente soddisfacente ... ma è bello vedere che concorda anche con la mia risposta! – Nefrubyr
potresti anche usare concatMap;) – hiena
Mi piace questa soluzione in quanto si riduce un po '. Sono d'accordo, è più chiaro della funzione concatMap. Mi è piaciuta anche la comprensione della lista (anche se inizialmente è un po 'più complessa da capire), quindi grazie ancora! :-) – Matt