<span style='font-family:Verdana'><span style='font-size:12px'><div> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">I am a bit puzzled by liftM2. I know what it does, but let's take a look at<br /> 
                the implementation.</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">liftM2&nbsp; :: (Monad m) =&gt; (a1 -&gt; a2 -&gt; r) -&gt; m a1 -&gt; m a2 -&gt; m r<br /> 
                liftM2 f m1 m2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = do { x1 &lt;- m1; x2 &lt;- m2; return (f x1 x2) }</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">Which could be rewritten (I am a bit uncomfortable with the do notation):</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">m1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;= \x1 -&gt;<br /> 
                m2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;&gt;= \x2 -&gt;<br /> 
                return (f x1 x2)</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">so: liftM2 (+) [1,2] [3,4] = [4,5,5,6]</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">The instance of the List monad tells me that:</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">instance&nbsp; Monad []&nbsp; where<br /> 
                &nbsp;&nbsp;&nbsp; m &gt;&gt;= k&nbsp;&nbsp; = foldr ((++) . k) [] m<br /> 
                &nbsp;&nbsp;&nbsp; m &gt;&gt; k&nbsp;&nbsp;&nbsp; = foldr ((++) . (\ _ -&gt; k)) [] m<br /> 
                &nbsp;&nbsp;&nbsp; return x&nbsp; = [x]<br /> 
                &nbsp;&nbsp;&nbsp; fail _&nbsp;&nbsp;&nbsp; = []</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">That foldr is just doing a concatMap, it seems to me.<br /> 
                But I still don't get the | return (f x1 x2) | part.<br /> 
                The first thing I thought was:</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">return ( (+) [1,2] [3,4] )</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">but of course this is not the IO monad, the bind operator does not just<br /> 
                fetch stuff from outer space.<br /> 
                &nbsp;<br /> 
                What is there really 'inside' x1 and x2 when the return statement is<br /> 
                evaluated, though?</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">I think I intuitively got it (x1 and x2 are bound to m1 and m2, every<br /> 
                f x1 x2 expression is evaluated and then put together in a list), but<br /> 
                it would be helpful to see what really happens to interiorise it.</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">I started from the first step</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">(&gt;&gt;=) m1 = foldr. ((++) . k) [] m1 -- partially applying m1</span></span></p> 
        <p style="margin:0px; padding:0px;" > 
                <span style="font-family: Verdana;"><span style="font-size: 12px;">but cannot really proceed from there. Any help will be appreciated,<br /> 
                if you think the question is not clear enough, do not hesitate to ask.</span></span></p> 
</div> 
</span></span>