&gt; It doesn&#x27;t tell me which of the calls is effectful and which is pure.<p>But it does because their type says so:<p><pre><code>   String read() effect IO
</code></pre>
(where `effect` is just like Java&#x27;s checked `throws`)<p>&gt; what is the type of a? &quot;(String effects IO)&quot; or some such?<p>Right. It is as I said, a type on read, not on a. `a` is still `String`.<p>&gt; only allowed inside the scope of a method with IO as an effect then it&#x27;s the same problem as checked exceptions.<p>But that&#x27;s the opposite of a problem. That&#x27;s like using `IO a` outside of an IO monad. You <i>want</i> the function to only be called in the right context (an appropriate handler is in effect).<p>&gt; it doesn&#x27;t match my experience.<p>Fair enough, and you&#x27;re not alone, but here&#x27;s the relevant discussion (about 4 minutes): <a href="https:&#x2F;&#x2F;youtu.be&#x2F;iHHSa39p48I?t=8h14m11s" rel="nofollow">https:&#x2F;&#x2F;youtu.be&#x2F;iHHSa39p48I?t=8h14m11s</a><p>&gt; Since you&#x27;re emphasizing it I&#x27;ll ask: how do you express effects that don&#x27;t commute?<p>The same way:<p><pre><code>    void foo() effects Either&lt;Writer&lt;Log&gt;&gt;
</code></pre>
etc.. (this doesn&#x27;t work with Java&#x27;s current type system, which doesn&#x27;t allow generic exception types, though).<p>I&#x27;m not sure if the same effects would make sense, though. For example, Either is a monadic value which doesn&#x27;t make sense in an imperative setting.<p>This works because you can have:<p><pre><code>    &lt;T&gt; T check(T x) effects MyEffect&lt;T&gt;</code></pre>