State Transformer
Theodore Norvell
theo@cs.ubc.ca
Fri, 11 Jan 2002 23:33:39 -0800 (PST)
> DIY? what does that means?
Do It Yourself. I.e. as in my tutorial.
> What if you want both and keep nice clean(*) programming style... :-)
You can compose monads. I've done something like the following in
the past (only with IO):
data StateTrans s a = StateTrans (s -> ST (s,a))
Here s is the global state. A function that changes
the global state
f :: s -> s
can be lifted into the monad by
listGlobalMutator :: (s -> s) -> StateTrans s a
liftGlobalMutator f = StateTrans (\s -> return (f s, ()))
similarly
liftGlobalAccessor :: (s -> a) -> StateTrans s a
liftGlobalAccessor g = StateTrans (\s -> return (s, g s))
and
liftST :: ST a -> StateTrans s a
liftST st = StateTrans (\s -> do { a<- st ; return (s, a)})
This gives you a fixed global state (which could be a tuple
of global variables) and as many dynamic variables (accessed via
references) as you want.
Probably I should have used a strict pair type above instead
of (,).
Cheers,
Theo Norvell