This Haskell package provides utilities for converting between computations parameterized via two different typeclasses, both of which can be used to abstract over monad transformer stacks with IO
at the base. Unfortunately, both classes are frequently used in the Haskell ecosystem, since they have minor differences:
-
MonadIO
comes from thebase
package (as ofbase
version 4.9.0.0), and it provides aliftIO
operation. It is an extremely simple typeclass, focusing exclusively on liftingIO
actions through transformer stacks withIO
at the base. -
MonadBase
comes from thetransformers-base
package, and it is a generalized version ofMonadIO
. It provides a more generalliftBase
function, which allows lifting to an arbitrary base monad.Generally, this additional power isn’t especially useful, but
MonadBase
appears most often throughMonadBaseControl
, a subclass from themonad-control
package that enables lifting operations that accept an action in negative position. This class has noIO
-specialized equivalent (not directly, at least), so it often appears in lifted “control” operations.
Due to these typeclasses being unrelated, it’s not entirely uncommon to end up with type signatures like (MonadIO m, MonadBaseControl IO m) => ...
, which are a little silly, since MonadBaseControl IO
really includes all the power of MonadIO
.
For more information, see the documentation on Hackage.