Take the 2-minute tour ×
Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. It's 100% free, no registration required.

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?

share|improve this question
1  
I have been having the same question for ages. –  devoured elysium Jul 21 '10 at 23:33
    
I added the intuition tag to reflect the "simple explanation" part. –  BBischof Jul 21 '10 at 23:50
3  
@Casebash: If you have no intention of accepting our answers, please stop asking these types of questions. –  user126 Jul 22 '10 at 18:23
1  
@Jonathan Actually, haskell.org/tutorial/monads.html they are the same. I don't completely understand that link, but what I extract makes me think they are the same. And they come right out and say it. Also, our last names are similar. –  BBischof Jul 22 '10 at 22:50
1  
@BBischof good to know! I also found this link which looks promising. en.wikibooks.org/wiki/Haskell/Category_theory. Yes your name makes me think I misspelled my name :). –  Jonathan Fischoff Jul 22 '10 at 23:28

4 Answers 4

up vote 6 down vote accepted

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.

share|improve this answer
    
The link was actually the most useful answer posted, so I edited it into your answer and accepted it –  Casebash Aug 18 '10 at 6:35
    
@casebash Lol! Best use of editing power EVER! –  BBischof Aug 18 '10 at 14:16
    
I find this and other similar descriptions of monads like the one by 97823123 rather un-enlightening. While knowing that monads are monoids in the (strict) monoidal endofunctor category (or functors in some specially concocted category) is an interesting and useful result, it fails to explain what monads are in any deeper sense or what they are good for. But the OP has already accepted this answer and any answer I could possibly give would need some heavy category theory, so I'll just register my disapointment and shut up. –  G. Rodrigues Aug 18 '10 at 21:52
    
@G. Rodrigues Two things. First, I was going for simple as the OP asked. And second, isn't this formulation deep to you? I find it very deep and satisfying. As the representations of a monoidal category, I feel like monads are much more interesting than the normal definition. Please DON'T shut up. If not for the sake of the OP, then for my sake, please tell me your deeper formulation! I am very interested! I also probably have the necessary background. If you think this forum is inappropriate email me: bryan (dot) bischof (at) gmail (dot) com. I would love to discuss this with you! :D –  BBischof Aug 18 '10 at 23:44
    
@G. Rodrigues, BBischof: As I said in my comment, the link was the best response I recieved to this answer. It gives a mathematical explanation of monads, while avoiding much of the complexities of category theory –  Casebash Aug 19 '10 at 0:16

TheCatsters have short YouTube videos explaining monads, and other parts of category theory: http://www.youtube.com/user/TheCatsters

share|improve this answer

Let $C$ be a category. Then a monad based at $C$ is a monoid in the strict monoidal category

$$\mathcal{End}(C)=\mathcal{Hom}_{Cat}(C,C),$$

where the natural monoidal product is given by composition of endofunctors, and the monoidal unit is the identity functor.

A monoid in a monoidal category is defined here.

If you need more explanation, just give me a call.

Notation: The category of functors $C\to D$ is also written as $Fun(C,D)$, but this notation is nonstandard. The standard notations are $\mathcal{Hom}_{Cat}(C,D)$ or simply $Cat(C,D)$.

share|improve this answer

(Sorry for the LaTeX, the symbols \mapsto and \{ and \} don't work.)

Monads in Haskell and monads in category theory are very much the same: A monad consists of a functor $T: C \to C$ and two natural transformations $\eta_X : X \to T(X)$ (return in Haskell) and $\mu_X : T(T(X)) \to T(X)$ (join in Haskell) subject to the following laws

$\mu_X \circ T(\eta_X) = \mu_X \circ \eta_{T(X)} = 1_{T(X)}$ (left and right unit laws)

$\mu_X \circ \mu_{T(X)} = \mu_X \circ T(\mu_X)$ (associativity)

So, compared to Haskell, the monad is defined in terms of return, join and fmap instead of return and (>>=). For more details on this, see also the Haskell wikibook.

Two examples may illuminate this definition.

The powerset functor

  • $\mathcal{P} = X \mapsto \mathcal{P}(X)$ maps a set to the set of its subsets.
  • Functions $f:X \to Y$ are extended point-wise to $\mathcal{P}(f):\mathcal{P}(X) \to \mathcal{P}(Y)$
  • $\eta_X : X \to \mathcal{P}(X)$ is the function $x \mapsto {x}$
  • $\mu_X : \mathcal{P}(\mathcal{P}(X)) \to \mathcal{P}(X)$ flattens the inner layer of subsets: $\mu_X(A) = { b | a \in A, b \in a }$.
  • In Haskell, this is known as the list monad.

The closure operation on the subsets of a topological space $S$ is a monad, too.

  • The objects of the category $C$ are the subsets of a given topological space $S$.
  • There is an unique arrow $X \to Y$ between to objects $X$ and $Y$ exactly when $X \subseteq Y$.
  • The monad is given by the functor that maps each object $X$ to its topological closure $\bar X$ and the arrow $X \subseteq Y$ to the arrow $\bar{X}\subseteq \bar{Y}$.
  • Clearly, we have $X \subseteq \bar X$; this is $\eta_X$.
  • Also, we know that $\bar{\bar X} = \bar X$, in particular $\bar{\bar X} \subseteq \bar X$; this is $\mu_X$.
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.