[Haskell-cafe] Why no IO transformer monad?

Keean Schupke k.schupke at imperial.ac.uk
Mon Dec 20 08:19:55 EST 2004

Perhaps you would care to explain this then?


    class Runnable m n where
       run :: m -> n

    class (Monad m,Monad (t m)) => MonadT t m where
       up :: m a -> t m a
       down :: t m a -> m a

    instance (Monad m,MonadT t m,Monad (t m)) => Runnable (t m a) (m a) 
        run = down

Or perhaps look at the type of the state transformer monad:

    newtype StateT st m a = ST { runST :: st -> m (st,a) }

To me it is quite clear that the return type runST returns "m (st,a)"
where m is the _base_ monad so lifting IO through the state-transformer 

    StateT st IO a

and applying runST to this type gives: IO (st a)...


Udo Stenzel wrote:

>Keean Schupke <k.schupke at imperial.ac.uk> schrieb am 20.12.04 12:13:08:
>>I thought you would get the following if you have a transformer 'M':
>>    runM :: M IO a -> IO a
>That's what I thought, too.  But it's the other way 'round. 
>Well, I can't comment on _why_ it's so counter-intuitive, but I'm pretty
>sure, the outermost transformer appears innermost in the final type.  
>It all makes sense somehow, you just have to remember that
>transformer types are somehow written backwards.
>Mit WEB.DE FreePhone mit hoechster Qualitaet ab 0 Ct./Min.
>weltweit telefonieren! http://freephone.web.de/?mc=021201

More information about the Haskell-Cafe mailing list