Quiero etiquetar cada elemento de un árbol con un valor diferente (Int, por ejemplo, sake). Logré hacer esto, pero el código es feo como una bestia y todavía no sé cómo trabajar con las Mónadas.Cómo decorar un árbol en Haskell
Mi opinión:
data Tree a = Tree (a, [Tree a])
tag (Tree (x, l)) n = ((m, x), l')
where (m,l') = foldl g (n,[]) l
where g (n,r) x = let ff = tag x n in ((fst $ fst ff) +1, (Tree ff):r)
¿Conoce alguna manera mejor?
EDIT: Me di cuenta de que el pliegue de arriba es mapAccumL. Por lo tanto, aquí está una versión limpia de lo anterior:
import Data.List (mapAccumL)
data Tree a = Tree (a, [Tree a])
tag (Tree (x, l)) n = ((m,x),l')
where (m,l') = mapAccumL g n l
g n x = let [email protected]((f,_),_) = tag x n in (f+1,ff)
Tenga en cuenta que mapAccumL es la misma que mapM para la mónada de estado, si elimina los newtypes. Entonces, cada vez que use mapAccumL, considere usar la mónada de estado. –