State Transformer

Albert Lai trebla@vex.net
11 Jan 2002 16:40:57 -0500


> > testfunc = do
> >            r <- newSTRef ('x',0)
> >            foo r
> >            bar r
> >            (c,n) <- readSTRef r
> >            return n

Jorge Adriano <jadrian@mat.uc.pt> writes:

> Yeap, I could do it like this myself :)
> The whole problem is with passing the 'r' as a parameter, which is precisly 
> what I'm trying to avoid.

I agree with you.  My work-around is then to define foo and bar locally
to testfunc, in the scope of r:

testfunc = do
           r <- newSTRef ('x',0)
           let foo = do
                     (c,n) <- readSTRef r
                     writeSTRef r ('a', n+1)
               bar = do
                     (c,n) <- readSTRef r
                     writeSTRef r (c,n+2)
           foo
           bar
           (c,n) <- readSTRef r
           return n

But if this looks like unsatisfactory (it does to me, too), perhaps
you have to go back to DIY monads.

DIY monads are good when: you fix the state variables, you don't want
to mention them in subprogram parameters.

The ST monad is good when: you create more state variables on the fly,
you use mutable arrays, you don't want to write your own monad and
put/get commands.