Actually, while I haven't even used monad transformers before (just
read about them a lot), I was thinking that something like this might
be the way to solve the lift . lift . lift . lift . foo problem on the
one hand, and by wrapping the 'contents' (e.g. the environment of a
reader monad) of every level of the stack in a unique newtype (if the
type isn't otherwise unique), the problem of "what if I want to use
the same transformer more than once, how do I disambiguate them". (Do
I have roughly the right idea?)

On Mon, Aug 9, 2010 at 9:05 PM, aditya siram <aditya.si...@gmail.com> wrote:
> Hi all,
> I was experimenting with monad transformers and realized that the stacking
> order of the monads can remain unknown until it is used. Take for example
> the following code:
>
> import "mtl" Control.Monad.State
> import "mtl" Control.Monad.Writer
> import "mtl" Control.Monad.Identity
>
> test :: (MonadWriter [Char] m, Num t, MonadState t m) => m ()
> test = do
>      put 1
>      tell "hello"
>
> main = do
>      x <- return $ runIdentity $ runStateT (runWriterT test) 1 -- test ::
> WriterT String (StateT Int Identity)
>      y <- return $ runIdentity $ runWriterT $ runStateT test 1 -- test ::
> StateT Int (WriterT String Identity)
>      z <- runWriterT $ runStateT test 1                        -- test ::
> StateT Int (WriterT String IO) (((), Int), String)
>      print x
>      print y
>      print z
>
> *Main> main
> (((),"hello"),1)
> (((),1),"hello")
> (((),1),"hello")
>
> Until test is called in 'main' we don't know the order of monads. In fact
> even the base monad is not know. All we know is that it uses the State and
> Writer monad. In each call to 'test' in main we can determine the stacking
> order and the base monad yielding different results. This seems to be a more
> flexible way of using monad transformers but I haven't seen this in code
> before so is there anything wrong with this style?
>
> -deech
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>



-- 
Work is punishment for failing to procrastinate effectively.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to