我知道數據構造函數和運行***函數,如何將函數提升到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