3

データ コンストラクターと 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
4

1 に答える 1