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 ...
Get Haskell High Performance Programming now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.