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:<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;">
<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<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>