There was a mistake in the trace, please ignore the previous one and look at this. Again your viewing window should be this wide:<br><font face="courier new,monospace">&lt;-----------------------------------------------------------------&gt;<br>
(liftM2 (&amp;&amp;) (&lt; 0.5) (&gt; -0.5))<br>=&gt; do {x1 &lt;- (&lt; 0.5);<br>       x2 &lt;- (&gt; -0.5);<br>       return ((&amp;&amp;) x1 x2)}<br><br>=&gt; (&lt; 0.5) &gt;&gt;= \x1<br>   (&gt; -0.5) &gt;&gt;= \x2<br>
   return ((&amp;&amp;) x1 x2)<br><br>=&gt; \r -&gt;(\x1 -&gt; <br>            (&gt; -0.5) &gt;&gt;= \x2<br>            return ((&amp;&amp;) x1 x2))<br>        ((&lt; 0.5) r)<br>        r<br><br>=&gt; \r -&gt; ((&gt; -0.5) &gt;&gt;= \x2<br>
          return ((&amp;&amp;) ((&lt; 0.5) r) x2))<br>          r<br><br>=&gt; \r -&gt; (\r&#39; -&gt; (\x2 -&gt; <br>                      return ((&amp;&amp;) (const (&lt; 0.5) r) x2))<br>                 ((&gt; -0.5) r&#39;)<br>
                 r&#39;)<br>         r        <br>=&gt; \r -&gt; (\r&#39; -&gt; (return ((&amp;&amp;) ((&lt; 0.5) r) ((&gt; -0.5) r&#39;))) r&#39;) r<br>=&gt; \r -&gt; (\r&#39; -&gt; (const ((&amp;&amp;) ((&lt; 0.5) r) ((&gt; -0.5) r&#39;))) r&#39;) r<br>
=&gt; \r -&gt; (\r&#39; -&gt; ((&amp;&amp;) ((&lt; 0.5) r) ((&gt; -0.5) r&#39;))) r<br>=&gt; \r -&gt; (\r&#39; -&gt; ((r &lt; 0.5) &amp;&amp; (r&#39; &gt; -0.5))) r<br><br></font><br><div class="gmail_quote">On Mon, Oct 19, 2009 at 11:42 AM, aditya siram <span dir="ltr">&lt;<a href="mailto:aditya.siram@gmail.com">aditya.siram@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">This one had me puzzled too - so did a traced through the program below. Please make sure your viewing window is at least this wide:<br>
<font face="courier new,monospace">&lt;----------------------------------------------------------------&gt;</font><br>
<br>It was more helpful to think of this as using the ((-&gt;) r) instance of Monad. It is defined in ./libraries/base/Control/Monad/Instances.hs in your GHC source as:<br><span style="font-family: courier new,monospace;">&gt;instance Monad ((-&gt;) r) where</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&gt;    return = const</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&gt;    f &gt;&gt;= k = \ r -&gt; k (f r) r</span><br style="font-family: courier new,monospace;">

<br>And const just returns its first argument like:<br>const 1 3 =&gt; 1<br>const &quot;hello&quot; &quot;world&quot; =&gt; &quot;hello&quot;<br><br>And liftM2 is defined in ./libraries/base/Control/Monad.hs as :<br><span style="font-family: courier new,monospace;">&gt;liftM2  :: (Monad m) =&gt; (a1 -&gt; a2 -&gt; r) -&gt; m a1 -&gt; m a2 -&gt; m r</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">&gt;liftM2 f m1 m2 = do { x1 &lt;- m1; x2 &lt;- m2; return (f x1 x2) }</span><br><br>So a trace of the program goes like this:<div class="im"><br> <br><span style="font-family: courier new,monospace;">(liftM2 (&amp;&amp;) (&lt; 0.5) (&gt; -0.5))</span><br style="font-family: courier new,monospace;">

</div><span style="font-family: courier new,monospace;">=&gt; do {x1 &lt;- (&lt; 0.5);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">       x2 &lt;- (&gt; -0.5);</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">       return ((&amp;&amp;) x1 x2)}</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">=&gt; (&lt; 0.5) &gt;&gt;= \x1</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">   (&gt; -0.5) &gt;&gt;= \x2</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">   return ((&amp;&amp;) x1 x2)</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">=&gt; \r -&gt;(\x1 -&gt; </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">            (&gt; -0.5) &gt;&gt;= \x2</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">            return ((&amp;&amp;) x1 x2))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">        ((&lt; 0.5) r)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">        r</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">=&gt; \r -&gt; (return (&gt; -0.5) &gt;&gt;= \x2</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">          return ((&amp;&amp;) ((&lt; 0.5) r) x2))</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">          r</span><br style="font-family: courier new,monospace;">

<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">=&gt; \r -&gt; (\r&#39; -&gt; (\x2 -&gt; </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                      return ((&amp;&amp;) (const (&lt; 0.5) r) x2))</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">                 ((&gt; -0.5) r&#39;)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                 r&#39;)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">         r        </span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">=&gt; \r -&gt; (\r&#39; -&gt; (return ((&amp;&amp;) ((&lt; 0.5) r) ((&gt; -0.5) r&#39;))) r&#39;) r</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">=&gt; \r -&gt; (\r&#39; -&gt; (const ((&amp;&amp;) ((&lt; 0.5) r) ((&gt; -0.5) r&#39;))) r&#39;) r</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">=&gt; \r -&gt; (\r&#39; -&gt; ((&amp;&amp;) ((&lt; 0.5) r) ((&gt; -0.5) r&#39;))) r</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">=&gt; \r -&gt; (\r&#39; -&gt; ((r &lt; 0.5) &amp;&amp; (r&#39; &gt; -0.5))) r</span><br><br>hope this helps,<br>-deech<div><div></div><div class="h5"><br><br><div class="gmail_quote">
On Mon, Oct 19, 2009 at 10:24 AM, Jordan Cooper <span dir="ltr">&lt;<a href="mailto:nefigah@gmail.com" target="_blank">nefigah@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Whoa... how on earth does this work? How does it interpret the<br>
sections as Reader monads?<br>
<div><br>
&gt; That&#39;s a job for the reader monad.<br>
&gt;<br>
&gt;<br>
&gt; Lambda Fu, form 53 - silent reader of truth<br>
&gt;<br>
&gt;     import Control.Monad<br>
&gt;     import Control.Monad.Reader<br>
&gt;<br>
</div>&gt;     filter (liftM2 (&amp;&amp;) (&lt; 0.5) (&gt; -0.5)) xs<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; Regards,<br>
&gt; apfelmus<br>
<div><div></div><div>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">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>
</div></div></blockquote></div><br>
</div></div></blockquote></div><br>