I have been learning some functional programming recently and I so I have come across monads. I understand what they are in programming terms, but I would like to understand what they are mathematically. Can anyone explain what a monad is using as little category theory as possible?
If you want to avoid too much category theory, you can first read this link to understand the definition of monads in Haskell. Then look at Wikibooks for a more mathematical look (thanks Jonathan Fischoff).
There are two descriptions that I know of. The first can easily be found by looking at wiki under Monad or consulting Harry’s nice summary. The second is more interesting in my opinion.
I will assume that you don’t know the definition of a monoidal action, if you do, just skip ahead.
A monoidal action is a functor from a monoid to the category of endofunctors on a category satisfying two coherence relations. These two coherence relations simply verify that your monoidal product is the same as composition in the target, and that the identity object behaves with the action. The relations are normally written as diagrams, but without latex implement, I wont type them here.
To get an idea of a monoidal action, consider a group action, and formulate it a little more categorically, by writing the two axioms as diagrams. These diagrams, when converted to the language of monoidal categories, are exactly those of a monoidal action.
Now the best part is once you have monoidal action, monads on a category are simply the category of monoidal actions from the trivial monoidal category to your category. Note here that the trivial monoidal category will be the monoidal category with one object one morphism and all the other monoidal data is trivially determined. The monadic coherence relations come for free from your monoidal action coherence relations.
So, my simple explanation?
In this way, we can formulate monads functorially as “representations” of the trivial monoidal category.
One can readily show the two definitions are the same.