データ コンストラクターと run*** 関数でわかっているのは、
任意の関数を特定の MonadTrans インスタンスに持ち上げることができます。
このような、
import Control.Monad.Trans
import Control.Monad.Trans.Maybe
import Control.Monad
liftF :: (Monad m) => (a -> b) -> MaybeT m a -> MaybeT m b
liftF f x = MaybeT $ do
inner <- runMaybeT x
return $ liftM f inner
しかし、このliftFを一般化するにはどうすればよいですか
liftF :: (MonadTrans t, Monad m) => (a -> b) -> t m a -> t m b