>>6
In Haskell, the state update in StateT makes the whole state get copied even if you only needed to update just a little tidbit. Throwing away megabytes of memory just to update a double is a little inefficient, don't you think?
Monad transformers are such a mess that it's easier just to keep everything in IO with IORefs. You get the same (nonexistent) level of type safety, and no obscure "ContT( StateT (ErrorT (WriterT (ReaderT (MaybeT IO" bullshit.