Monads in Clojure
intensivesystems.net
intensivesystems.net
This comment isn't intended as a knock against the article. I think there's a lot of merit in using monadic constructs in languages that aren't Haskell, I just think Haskell's type system makes understanding the concept easier.
Also, I've found the usage of monads as the building blocks for modular interpreters to shed the most light on their power, utility, and limitations (see the various papers from Steele, Wadler et al, Hudak et al, and Felleisen et al).
This is a false choice. Learning monads through Haskell, you get the forest and the trees! That said, I get that there are legitimate differences of opinion and what worked for me will not necessarily work for others. I feel like some understanding of types (or categories, etc.) is necessary to fully grok monads. Both this article and your linked paper offer some basic explanation of the concept. Tutorials that are essentially implementations of bind are, in fact, missing the forest for the trees.
Before we begin, it is important to briefly talk about the λ- calculus in the context of termination. In short, the λ-calculus is strongly normalizing and thus non-termination is impossible as a general rule.
Of course, this is because I only barely grok Haskell. If I really knew Haskell I'm sure I wouldn't have an issue with the syntax, but as someone trying to learn about Monads from a category-theoretic perspective, Haskell just ends up confusing me more than the extra annotations provided by its type system can compensate.
I found I understood monads a little better after this article, because the Lisp syntax is uniform enough that it disappeared into the background. The lack of type annotation brings some fresh confusion right back in, but that's the cost of using Clojure for this example.
Again, all of this is just how my own brain works. Your brain may vary :)
An interesting approach would be to try teaching monads with typed Racket. [1]
Of course, I'm really trying to do the opposite--get a basic understanding of the math from using functors, monads and so on in Haskell. I also read about type theory for fun, so maybe I'm not the least biased person to ask about static typing :P.
Different strokes, obviously, but just thought I'd mention an alternative.
cue light bulb coming on
Thanks so much for this article; I've been trying to understand monads forever now. The closest I got was the "burrito" analogy, but I always wanted a more mathematically sound intuition.
For helpful reference, here's a collection of monad tutorials and related pedagogy:
- Monads are burritos [https://speakerdeck.com/u/dimituri/p/a-monad-is-just-a-burri...] (slide deck)
- No, they really aren't [http://byorgey.wordpress.com/2009/01/12/abstraction-intuitio...]
- Well yeah, they kinda are [http://blog.plover.com/prog/burritos.html]
- But anyway, you probably have already invented them yourself; you just didn't realize it [http://blog.sigfpe.com/2006/08/you-could-have-invented-monad...]
- And even if you didn't, you can always learn about it from that crowd-sourced fountain of programmer knowledge, StackOverflow (and this question hasn't even been closed as "not constructive"!) [http://stackoverflow.com/questions/44965/what-is-a-monad]
- Of course, once you understand basic category theory, you should be set anyway. What are you, some kind of Java programmer? [http://reperiendi.wordpress.com/2007/11/03/category-theory-f...]
- But really, a monad is just a monoid in the category of endofunctors, what's the problem? [http://stackoverflow.com/questions/3870088/a-monad-is-just-a...]
You can find out what happened to the rest of clojure.contrib here: http://dev.clojure.org/display/design/Where+Did+Clojure.Cont...
I don't use it enough to "get it" so I have to re-learn it every time I feel the need to, but this is the go-to spot for me.