[Haskell-beginners] Re: pattern for tree traversel with a state
Jan Jakubuv
jakubuv at gmail.com
Thu Oct 23 18:47:43 EDT 2008
2008/10/23 Andreas-Christoph Bernstein <andreas.bernstein at medien.uni-weimar.de>:
> apfelmus wrote:
>>
>
> But what i need is
> [(0,"a"),(1,"a"),(2,"a"),(1,"a"),(0,"a")]
>
> So state changes should affect only their subtree, not the rest of the tree
> to the right.
>
It seems to me that you are looking for the Reader monad. Try the following:
import Control.Monad.Reader
t :: (a -> b -> b) -> BTree a -> Reader b (BTree b)
t f (Leaf x) = do
s <- ask
return (Leaf (f x s))
t f (Fork x l r) = do
s <- ask
l' <- local (f x) (t f l)
r' <- local (f x) (t f r)
return (Fork (f x s) l' r')
new = runReader (t modState sampleTree) globalState
Then,
flattenTree new
gives you
[(0,"a"),(1,"a"),(2,"a"),(1,"a"),(0,"a")]
I think that the Reader monad is a standard way to this. When you want
the state to affect also the rest of the tree then use the State
monad.
Sincerely,
jan.
More information about the Beginners
mailing list