Я знаю конструктор данных и функцию 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
Но как я могу обобщить этот подъем F на
liftF :: (MonadTrans t, Monad m) => (a -> b) -> t m a -> t m b
liftM
?t m
- это сама монада. - person tomferon   schedule 16.05.2013liftM
тоже не является обобщенным. Поскольку я должен написатьinstance Monad (SomeMonadTrans m) where ...
перед использованиемliftM
, мне все еще нужно знать SomeMonadTrans. - person Znatz   schedule 16.05.2013