&gt; The interaction between control effects (of which exceptions are a particular case) and substructural types (of which C++&#x27;s RAII is a very broken particular case) is certainly nontrivial<p>A nitpick, but what constitutes an effect is rather arbitrary. An effect in the PFP sense is not an operational definition (other than IO) but a linguistic one. This is why I think that handling errors well, handling mutation well and handling IO well are three completely different problems that are only accidentally bundled into one by PFP for no cognitive&#x2F;empirical reason other than that the lambda calculus happens to be equally challenged by all three.<p>There is a fourth effect, which is just as operational as IO (and thus a &quot;truer&quot; effect than errors or mutation) and is often the most interesting, yet it happens to be the one that baffles PFP&#x2F;LC most: the passage of time. This is why there are usually two ways to sleep in PFP languages, one considered an effect, and the other is not (but happens to be much more operationally disruptive, and thus a stronger &quot;effect&quot;).