Я новичок в трансформаторах монады, поэтому извините легкий вопрос.
У меня есть значение val :: MaybeT IO String и функция fn :: String -> IO [String].
Поэтому после привязки у меня есть val >>= liftM fn :: MaybeT IO (IO [String]). Как удалить дублирующую IO-монаду и получить результат типа MaybeT IO [String]?
Монадские трансформаторы monad duplication
Ответ 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