Use lift
(or liftIO
) instead of liftM
.
> :t val >>= lift . fn
val >>= lift . fn :: MaybeT IO [String]
liftM
is for applying pure functions in a monad. lift
and liftIO
are for lifting actions into a transformer.
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