There are Haskell types that have an associated monad structure, but cannot be made instances of the `Monad`

class. The reason is typically that the *return* or the *bind* operation of such a type `m`

has a constraint on the type parameter of `m`

. As a result, all the nice library support for monads is unusable for such types. This problem is called the constrained-monad problem.

In my article *The Constraint kind*, I described a solution to this problem, which involved changing the

`Monad`

class. In this article, I present a solution that works with the standard `Monad`

class. This solution has been developed by Neil Sculthorpe, Jan Bracker, George Giorgidze, and Andy Gill. It is described in their paper *The Constrained-Monad Problem*and implemented in the

*constrained-normal*package. Continue reading