2013-05-19 20 views
10

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

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