simple descriptions of recursion, monads, and closures
Joachim Durcholz gives the simplest descriptions of recursion, monads, and closures that I’ve run across in a post to comp.lang.scheme:
Don’t give recursion a name, say “yes, a function is allowed to call itself – just make sure that every invocation does some real work”.
Don’t give monadic I/O a name, say “functions aren’t allowed to have side effects, the code just generates a description of the effects”.
Don’t give closures a name, say “you can pass around an unevaluated ‘expression with holes’, just consider that the variables that were defined at the place where the expression is written will be taken from that place, not from the place where the thing will be evaluated”.

