For me, this is the money quote:<p><i>The monad instance defines what each kind of computation has to do with these continuations.<p>A bind has two parameters: a closure and a continuation.</i><p><pre><code> x >>=(f1>>=(f2 >>=f3))
</code></pre>
Serious light-bulb moment. I'm very used to thinking about and leveraging closures in imperative languages, but the above finally connected the idea that I can deliberately build abstractions/DSLs like this in Haskell for purposes such as action history manipulation. Computation as data! Love it!