A computation whose value is a.
A computation whose value is obtained by first runnning ta then
passing its value to the continutation k to get the computation
that provides the final value.
A computation whose value is obtained from the computation that is
returned by the continuation k.
A computation that produces an A.
A computation that returns a when it is eventually run.
Trampolines. Useful for converting stack-heavy operations into heap-based ones and thereby avoiding stack overflow.
Based on code from "Stackless Scala With Free Monads", Runar Oli Bjarnason.