[英]How to lift function to transformed monad in haskell?
我知道使用數據構造函數和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 :: (MonadTrans t, Monad m) => (a -> b) -> t m a -> t m b
如@thoferon所述,您可以只使用liftM
:
import Control.Monad.Trans
import Control.Monad.Trans.Maybe
import Control.Monad (liftM)
liftF :: (Monad m) => (a -> b) -> MaybeT m a -> MaybeT m b
liftF f m = liftM f m
liftF' :: (MonadTrans t, Monad m, Monad (t m)) => (a -> b) -> t m a -> t m b
liftF' f m = liftM f m
(我必須在liftF'
上添加一個額外的Monad約束)。
但是,為什么要這樣做呢? 查看MaybeT
的源代碼-已經有一個Monad實例:
instance (Monad m) => Monad (MaybeT m) where
fail _ = MaybeT (return Nothing)
return = lift . return
x >>= f = MaybeT $ do
v <- runMaybeT x
case v of
Nothing -> return Nothing
Just y -> runMaybeT (f y)
實際上,因為liftM
與Functor的fmap
相同:
instance (Functor m) => Functor (MaybeT m) where
fmap f = mapMaybeT (fmap (fmap f))
您可以為所有變壓器找到類似的實例。
這是您要問的嗎? 您能否提供一些更具體的示例來說明您正在嘗試做什么以及原因,以及現有的Functor和Monad實例無法滿足您的需求?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.