I think you are mistaken, if I understood right one of the key properties of monads is to ensure order of execution, therefore if you do:<br><br>r1 &lt;- m1<br>r2 &lt;- m2<br><br>you are going to run both m1 and m2 (and in this order).<br>
<br>and indeed:<br><br>---------<br>import Control.Monad<br><br>(&lt;||&gt;) = liftM2 (||)<br><br>f1 = do<br>    putStrLn &quot;f1&quot;<br>    return True<br><br>f2 = do<br>    putStrLn &quot;f2&quot;<br>    return True<br>
<br>main = do f1 &lt;||&gt; f2<br>---------<br><br>output is:<br><br>f1<br>f2<br><br><br><div class="gmail_quote">On Sat, Nov 3, 2012 at 9:37 AM, Rustom Mody <span dir="ltr">&lt;<a href="mailto:rustompmody@gmail.com" target="_blank">rustompmody@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_extra"><div class="gmail_quote"><div class="im">On Wed, Oct 31, 2012 at 10:44 PM, Daniel Trstenjak <span dir="ltr">&lt;<a href="mailto:daniel.trstenjak@gmail.com" target="_blank">daniel.trstenjak@gmail.com</a>&gt;</span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
(&lt;||&gt;) :: Monad m =&gt; m Bool -&gt; m Bool -&gt; m Bool<br>
(&lt;||&gt;) m1 m2 = do<br>
   r1 &lt;- m1<br>
   if r1 then return True else m2<br>
<br></blockquote></div><div><br>We can do some algebraic simplification, using the law<br><i><b>if P  then True else Q </b> </i>is same as <b>P || Q</b> :<div class="im"><br><br>(&lt;||&gt;) m1 m2 = do<br>   r1 &lt;- m1<br>
</div>   r2 &lt;- m2<br>   return (r1 || r2)<br>
<br>Which reminds me of the definition of liftM2<br>(from Control.Monad):<br><pre><a name="13ac56c44a5e7915_line-288"></a><span>liftM2</span> <span>f</span> <span>m1</span> <span>m2</span>          <span>=</span> <span>do</span> <span>{</span> <span>x1</span> <span>&lt;-</span> <span>m1</span><span>;</span> <span>x2</span> <span>&lt;-</span> <span>m2</span><span>;</span> <span>return</span> <span>(</span><span>f</span> <span>x1</span> <span>x2</span><span>)</span> <span>}</span> 
<a name="13ac56c44a5e7915_line-289"></a></pre> And so we can golf down to:<br>(&lt;||&gt;) = liftM2 (||)<br><br>Now, instead of using liftM2 from Control.Monad, I could as well use liftA2 from Control.Applicative :<br><br>
(&lt;||&gt;) = liftA2 (||)<br>
<br>So my questions to the experts: <br><br>1&gt; Are these equivalent or am I missing something?<br>2&gt; Any thumb rules on when to use Control.Monad and when to use Control.Applicative?<br><br>Rusi <br></div></div><span class="HOEnZb"><font color="#888888">-- <br>

<a href="http://blog.languager.org" target="_blank">http://blog.languager.org</a><br>
<br><br>
</font></span></div>
<br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br>