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
10
A
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