Ответ 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