Composition Monad

Tom Pledger Tom.Pledger@peace.com
Mon, 18 Feb 2002 15:52:38 +1300


Andre W B Furtado writes:
 | Roughly speaking, I'm in need of a monad (say MyIO) that interprets the
 | following code
 | 
 | >f :: MyIO ()
 | >f = do
 | >        action1
 | >        action2
 | >        action3
 | >        ...
 | >        return ()
 | 
 | 
 | as applying action1 to g, then action2 to the SAME g (not the result of
 | action1) and so on...
 | 
 | Of course, this "g" will be specified when starting the monad (something
 | like "runMyIO g"). Does this "composition monad" already exist? If no, can
 | anyone give me some hints to create my own?

I think it's called a reader monad or an environment monad.  Here's a
fairly simple version:

instance Monad ((->) env) where
    return x = \env -> x
    m >>= f  = \env -> f (m env) env