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 ainstance (Monad m,MonadT t m,Monad (t m)) => Runnable (t m a) (m a) where
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 gives:
StateT st IO a
and applying runST to this type gives: IO (st a)...
Keean.
Udo Stenzel wrote:
Keean Schupke <[EMAIL PROTECTED]> 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.
Udo. __________________________________________________________ Mit WEB.DE FreePhone mit hoechster Qualitaet ab 0 Ct./Min. weltweit telefonieren! http://freephone.web.de/?mc=021201
_______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe
