<div dir="ltr">There may be another third way to encode effects: <div><br></div><div>Maybe it is possible to demonstrate that every effect may be a combination of state (data) and continuations (processing).  I don´t know if this is true, but it is very likely.</div><div><br></div><div>If a monad can handle user defined states (in a pure way, like the state monad) and continuations, then the programmer can  implement any new effect by combining them. </div><div><br></div><div> With continuation effect I mean that each monadic statement can inspect and make use of his own computation in which it is inserted (his closure) and his continuation.</div><div><br>The effects are added by creating new primitives, instead of  aggregating new monad transformers (mtl) or declaring new effects (the free monad).</div><div><br></div><div>I implemented reactivity, backtracking, streaming and other high level effects besides readers, writers  and other conventional effects using this approach, in the package transient.</div><div><br></div><div>The advantage is  Expressive power (high level effects), composability, simple type signatures,  and extensibility by means of a single expression.</div><div><br></div><div>It may be necessary to have more than one monad when we want to enforce certain effects that are performed when one monad is converted into to another, trough the type system</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-10-16 2:28 GMT+02:00 John Wiegley <span dir="ltr"><<a href="mailto:johnw@newartisans.com" target="_blank">johnw@newartisans.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">>>>>> "O" == Oleg  <<a href="mailto:oleg@okmij.org">oleg@okmij.org</a>> writes:<br>
<br>
O> and require the boilerplate of writing functor instances<br>
<br>
Just note, since DeriveFunctor there is almost never any such boilerplate in<br>
these cases.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F<br>
<a href="http://newartisans.com" rel="noreferrer" target="_blank">http://newartisans.com</a>                          60E1 46C4 BD1A 7AC1 4BA2<br>
</font></span><div class="HOEnZb"><div class="h5">______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Alberto.</div>
</div>