Преобразователи монад дублирование монад

Я новичок в монадных трансформерах, поэтому извините, простой вопрос. У меня есть значение val :: MaybeT IO String и функция fn :: String -> IO [String]. Итак, после привязки у меня есть val >>= liftM fn :: MaybeT IO (IO [String]). Как я могу удалить повторяющуюся монаду ввода-вывода и получить результат типа MaybeT IO [String]?


person KAction    schedule 19.05.2013    source источник


Ответы (1)


Используйте lift (или liftIO) вместо liftM.

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

liftM предназначен для применения чистых функций в монаде. lift и liftIO предназначены для действий по подъему в трансформатор.

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
person hammar    schedule 19.05.2013