Christoph Lüth
FB 3 - Mathematik und Informatik, Universität Bremen

Neil Ghani
Department of Mathematics and Computer Science,
University of Leicester

Monads are a useful abstraction of computation, as they model
diverse computational effects such as stateful computations,
exceptions and I/O in a uniform manner. Their potential to provide
both a modular semantics and a modular programming style was soon
recognised. However, in general, monads proved difficult to compose
and so research focused on special mechanisms for their composition
such as distributive monads and monad transformers.

We present a new approach to this problem which is general in that
nearly all monads compose, mathematically elegant in using the
standard categorical tools underpinning monads and computationally
expressive in supporting a canonical recursion operator. In a
nutshell, we propose that two monads should be composed by taking
their \emph{coproduct}. Although abstractly this is a simple idea,
the actual construction of the coproduct of two monads is
non-trivial. We outline this construction, show how to implement
the coproduct within Haskell and demonstrate its usage with a few
examples. We also discuss its relationship with other ways of
combining monads, in particular distributive laws for monads and
monad transformers.