Why this function doesn't compile?
phi :: Monad m => StateT s m ()
phi = lift $ return ()
I get (ghc-7.4.1)
Could not deduce (MonadTrans (StateT s))
arising from a use of `lift'
from the context (Monad m)
This means exactly what it says: you have stated that m must be a Monad, but you didn't say anything about whether it's a MonadTrans, so you can't use "lift". The correct signature would be
phi :: (Monad m, MonadTrans m) => StateT s m ()
--