&gt; I&#x27;m not sure I understand the distinction. You can always use something like Optional (Maybe) if you want a value.<p>I mean that the &quot;value or error&quot; that I get back from a function that returns Either <i>is itself a value</i>, that I can use in the normal way I would use a value. I can pull it out into a static field. More importantly I can pass it back and forth through generic functions without them having to do anything special about it (e.g. as a database load callback), because it&#x27;s just a value. I notably can&#x27;t do this with exceptions (or e.g. if I&#x27;m emulating Writer with a global or ThreadLocal variable), though checked exceptions will at least fail this at compile time.<p>&gt; would never call the writer (like your first example, I believe)<p>Hmm. If you&#x27;re willing to fix the order in which effects happen (and explicitly handle when you want to change it, as in your example) then you can write something much simpler than the usual monad transformers, so make sure you&#x27;re comparing like with like.