Here’s a nice quip from Luke Gorrie on Twitter:
Monads are hard because there are so many bad monad tutorials getting in the way of finally finding Wadler’s nice paper.
Here’s the paper by Philip Wadler that I expect Luke Gorrie had in mind: Monads for functional programming.
Here’s the key line from Wadler’s paper:
Pure functional languages have this advantage: all flow of data is made explicit. And this disadvantage: sometimes it is painfully explicit.
That’s the problem monads solve: they let you leave implicit some of the repetitive code otherwise required by functional programming. That simple but critical point left out of many monad tutorials.
Dan Piponi wrote a blog post You Could Have Invented Monads! (And Maybe You Already Have) very much in the spirit of Wadler’s paper. He starts with the example of adding logging to a set of functions. You could have every function return not just the return value that you’re interested in but also the updated state of the log. This quickly gets messy. For example, suppose your basic math functions write to an error log if you call them with illegal arguments. That means your square root function, for example, has to take as input not just a real number but also the state of the error log before it was called. Monads give you a way of effectively doing the same thing, but conceptually separating the code that takes square roots from the code that maintains the error log.
As for “so many bad monad tutorials,” see Brent Yorgey on the monad tutorial fallacy.
By the way, this post is not Yet Another Monad Tutorial. It’s simply an advertisement for the tutorials by Philip Wadler and Dan Piponi.