&gt; No, I&#x27;m talking about delimited continuations. No need for TCO. The continuation contains only a portion of the stack (off the top).<p>I don&#x27;t think that resolves it. It&#x27;s quite normal to want to chain together a few thousand or million monadic operations even within a single method (e.g. making a number of network calls, writing lines if you&#x27;re managing I&#x2F;O monadically). If doing that results in a stack overflow then that severely limits the utility of this approach.<p>&gt; Right, but we&#x27;re talking about delimited continuations, i.e shift&#x2F;reset, not call&#x2F;cc. You can simply treat them as threads. They&#x27;re not at all like gotos (you can read my blog post). My claim is that they fit much better with imperative (including functional-imperative) languages than monads.<p>I did read it; I&#x27;m sorry if I&#x27;ve got the terminology wrong. I found e.g. the &quot;class Foo&quot; example really hard to follow the control flow; in that sense it seemed goto-like to me. I find threads really hard to reason about, so &quot;it&#x27;s as easy as threads&quot; doesn&#x27;t really appeal.<p>I&#x27;ve not seen the term &quot;functional-imperative&quot; used that way, and usually the two are contrasted - can you clarify what class of languages you&#x27;re talking about?