Wolfgang Jeltsch wolfgang at jeltsch.net
Wed Dec 21 12:31:35 EST 2005

```Am Mittwoch, 21. Dezember 2005 16:28 schrieb David Barton:
> Wolfgang Jeltsch writes:
> ----- Original Message -----
>
> > Am Mittwoch, 21. Dezember 2005 13:15 schrieb Creighton Hogg:
> >> [...]
> >>
> >> Monads, I believe, can be just thought of as containers for state.
> >
> > I would say that you are talking especially about the I/O monad here.  A
> > monad as such is a rather general concept like a group is in algebra.
>
> While this is correct, I'm afraid that for most of us it is a flavorless
> this context instantly intuitively recognizable, but I don't.

The point is that the concept of a monad is a rather abstract one.  Maybe we
should take vector spaces instead of groups.  A vector space is just a set
together with two operations, namely vector addition and scalar
multiplication whereby the operations have to fulfill a couple of laws.  One
law, for example, would be that vector addition is commutative.

The point is that this vector space concept is very general.  There are a lot
of concrete vector spaces which all fit that general idea.  For example, R^2
together with the commonly defined vector addition and scalar multiplication
is a vector space.  But there are many others, lots of which seem to have
nothing to do with R^2 and its operations from the first sight.  So we have a
general concept "vector space" and a lot of concrete vector spaces.

Now, "monad" is a general concept like "vector space".  In Haskell terms a
monad is a type of kind * -> * (i.e., a type which needs to be applied to one
type parameter in order to be able to be used as a type of expressions)
together with operations (>>=) and return whereby (>>=) and return have to
have specific types and have to fulfill certain laws.

IO together with its (>>=) and return is an example of a concrete monad.  []
together with concatMap and \x -> [x] is another one.  This may seem very
surprising at first ("What do lists have to do with I/O computations?") but
it's really so.

> I think Phil Wadler said it best when he said that a monad is a
> *computation*.

No, a value of type IO <something> is a computation.  The type IO plus (>>=)
plus return is a monad.  So is [] plus concatMap plus \x -> [x].

> [...]

> Dave Barton

Best wishes,
Wolfgang
```