簡體   English   中英

如何在haskell中提升功能到已轉換的monad?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM