2013-05-19 31 views
10

Sono un neofita dei trasformatori monad, domanda così dispiaciuta. Ho il valore val :: MaybeT IO String e la funzione fn :: String -> IO [String]. Quindi dopo l'associazione, ho val >>= liftM fn :: MaybeT IO (IO [String]). Come posso rimuovere la monade IO duplicata e ottenere il risultato del tipo MaybeT IO [String]?Trasformatori Monad Duplicazione Monad

risposta

13

Utilizzare lift (o liftIO) anziché liftM.

> :t val >>= lift . fn 
val >>= lift . fn :: MaybeT IO [String] 

liftM è per l'applicazione di funzioni pure in una monade. lift e liftIO sono per il sollevamento di azioni in un trasformatore.

liftM :: Monad m => (a -> b) -> m a -> m b 
lift :: (Monad m, MonadTrans t) => m a -> t m a 
liftIO :: MonadIO m => IO a -> m a