&gt; But how is `a = read(); print(a)` not explicit?<p>It doesn&#x27;t tell me which of the calls is effectful and which is pure. It&#x27;s clear enough at the direct level, but if I&#x27;m calling methods that I don&#x27;t know the implementation of then the =&#x2F;&lt;- distinction when using monadic style is very helpful.<p>&gt; That&#x27;s only to explain the typing. Java&#x27;s checked continuations are an effect system, and the list of thrown exceptions can be viewed as a list of effects a function may have. That&#x27;s how you can ensure that a function calling read and print will only be called within a context that implements a handler for those effects.<p>So if I do &quot;a = read()&quot; what is the type of a? &quot;(String effects IO)&quot; or some such? If it&#x27;s &quot;string, but only allowed inside the scope of a method with IO as an effect&quot; then it&#x27;s the same problem as checked exceptions.<p>&gt; Off-topic, but that is a myth (there was an unscientific poll about this in the last JavaOne conference).<p>Hmm. I wouldn&#x27;t expect conference-goers to be a representative sample, and it doesn&#x27;t match my experience.<p>&gt; The difference between continuation-effects and monads is that a function making use of continuations can use multiple effects without requiring nasty monad-transformers (and that&#x27;s exactly the problem Kiselyov wanted to solve with his handler system).<p>Since you&#x27;re emphasizing it I&#x27;ll ask: how do you express effects that don&#x27;t commute? EitherT[Writer[Log, ?], Error, Value] behaves very differently from WriterT[Either[Error, ?], Log, Value].