Lifting up from I/O
In real-world applications, it's quite usual for much of the code base to live in monads or monad stacks. In such situations, concurrency operations from Control.Concurrent become challenging, because they all are monomorphic in IO. Sometimes this isn't much of a problem, because we can use liftIO from the MonadIO class to lift arbitrary IO actions.
But MonadIO leaves two important cases uncovered. The first one is about other base monads besides IO, such as STM. Though more limited in its use cases, it's sometimes desired to have a monad stack on top of STM. The other case is about exception handling, for which MonadIO is quite insufficient; all of Control.Exception is monomorphic in IO, meaning a lot of plumbing if they are ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access