Soy bastante nuevo para Haskell y estoy tratando de averiguar cómo atravesar un árbol n-ario. Como salida Busco para obtener una lista de los valores de la hoja (como las ramas no tienen ningún valor), así que para testtree esto sería: 4,5Haskell n-ary tree traversal
Mi definición hasta ahora es:
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")]
Pero se da el error:
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
estoy suponiendo que esto se debe a xs es una lista de los árboles y su esperando un árbol singular. ¿Hay alguna forma de hacer esto? He estado tratando de la función de mapa, a lo largo de las líneas de:
travTree (Branch (x:xs)) = travTree x : map travTree xs
Pero luego se queja de:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `travTree'
También he intentado cambiar la firma de función:
travTree :: Tree a -> [b]
que da el error:
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
Cualquier ayuda sería muy apreciada, así que gracias de antemano ..!
Su primera respuesta con la lista de comprensión estaba perfectamente bien ... ¡pero es bueno ver que usted está de acuerdo con mi respuesta también! – Nefrubyr
también podría usar concatMap;) – hiena
Me gusta esta solución ya que se descompone un poco. Estoy de acuerdo, es más claro que la función concatMap. También me gustó la comprensión de la lista (aunque inicialmente un poco más compleja de entender), ¡así que gracias de nuevo! :-) – Matt