Ich bin neu zu Monad Transformatoren, so tut mir leid, einfache Frage. Ich habe Wert val :: MaybeT IO String
und Funktion fn :: String -> IO [String]
. Also nach dem Binden habe ich val >>= liftM fn :: MaybeT IO (IO [String])
. Wie kann ich doppelte IO-Monade entfernen und das Ergebnis vom Typ MaybeT IO [String]
erhalten?Monad Transformatoren Monad Duplizierung
10
A
Antwort
13
Verwenden Sie lift
(oder liftIO
) anstelle von liftM
.
> :t val >>= lift . fn
val >>= lift . fn :: MaybeT IO [String]
liftM
ist in einer monadisch reine Funktionen anwenden. lift
und liftIO
sind zum Heben von Aktionen in einen Transformator.
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