2013-05-19 21 views
10

Jestem nowy w monad transformatory, więc przepraszam łatwe pytanie. Mam wartość val :: MaybeT IO String i funkcję fn :: String -> IO [String]. Więc po związaniu mam val >>= liftM fn :: MaybeT IO (IO [String]). Jak mogę usunąć zduplikowaną monotację IO i uzyskać wynik typu MaybeT IO [String]?Monad powielacze monad powielanie

Odpowiedz

13

Użyj lift (lub liftIO) zamiast liftM.

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

liftM służy do stosowania czystych funkcji w monadzie. lift i liftIO służą do podnoszenia akcji do transformatora.

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 
Powiązane problemy