<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
Hello,<div><br></div><div><br><div><div>On 14 May 2008, at 02:06, Ronald Guida wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">I have a few questions about commutative monads and applicative functors.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div> <blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">From what I have read about applicative functors, they are weaker than</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">monads because with a monad, I can use the results of a computation to</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">select between alternative future computations and their side effects,</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">whereas with an applicative functor, I can only select between the</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">results of computations, while the structure of those computations and</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">their side effects are fixed in advance.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">But then there are commutative monads.<span class="Apple-converted-space">  </span>I'm not exactly sure what a</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">commutative monad is, but my understanding is that in a commutative</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">monad the order of side effects does not matter.</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">This leads me to wonder, are commutative monads still stronger than</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">applicative functors, or are they equivalent?</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div></blockquote><div><br></div><div>I would say that they are stronger because they still support:</div><div><br></div><div>concat :: Monad m => m (m a) -> m a</div><div><br></div><div>or</div><div><br></div><div>(>>=) :: Monad m => m a -> (a -> m b) -> m b</div><div><br></div><div>which are not supported, in general, by applicative functors.</div><div><br></div><div>In fact, I would probably risk to say that they are even stronger than monads</div><div>(as there are less commutative monads than regular monads).</div><br><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">And by the way, what exactly is a commutative monad?</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br></div></blockquote><div><br></div><div>Here is a possible characterization:</div><div><br></div><div>The monad m is commutative if, for all mx and my:</div><div><br></div><div>do {x &lt;- mx; y &lt;- my; return (x,y)} = do {y &lt;- my; x &lt;- mx; return (x,y)}</div><div><br></div><div>As you mentioned above, the basic idea is that the order of the side effects </div><div>does not matter. This law is not true in general for monads.</div><div><br></div><div>I am not sure if you know about the paper entitled "The essence of the </div><div>Iterator Pattern" (by Jeremy Gibbons and myself):</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: 12.0px Helvetica"><a href="http://www.comlab.ox.ac.uk/people/Bruno.Oliveira/iterator-jfp.pdf">http://www.comlab.ox.ac.uk/people/Bruno.Oliveira/iterator-jfp.pdf</a></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">But, you may be interested to read it as it discusses related ideas. In </div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">particular you may want to take a look at Section 5.4. </div></div><div><br></div><div>Cheers,</div><div><br></div><div>Bruno</div></div></div></body></html>