我知道数据构造函数和运行***函数,如何将函数提升到haskell中的已转换monad?
我可以将任何函数提升到特定的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
为什么不使用'liftM'? 't m'本身就是monad。 – thoferon
@ thoferon,是的,但'liftM'也不是一般化的。因为在使用'liftM'之前我必须写'instance Monad(SomeMonadTrans m)',但是我仍然需要知道SomeMonadTrans。 – Znatz