On Tue, Nov 30, 2010 at 12:08 PM, Larry Evans <span dir="ltr">&lt;<a href="mailto:cppljevans@suddenlink.net">cppljevans@suddenlink.net</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
so now I must &quot;manually&quot; figure out what the a and b in<br>
the ap declaration correspond to in the return(:) type:<br>
<br>
        m    ( a             -&gt;           b           )<br>
        __     _                          _<br>
     1: []     Char          -&gt;     [Char]-&gt;[Char]<br>
     2: []     Char-&gt;[Char]  -&gt;          [Char]<br>
<br></blockquote><div>A type a -&gt; b -&gt; c is always equivalent to the type a -&gt; (b-&gt;c), not (a-&gt;b) -&gt; c.<br><br>In particular, breaking down sequence (c:cs) = return (:) `ap` c `ap` sequence cs<br>
<br> return (:) :: m (a -&gt; [a] -&gt;[a])<br> (\c -&gt; return (:) `ap` c) :: m a -&gt; m ([a] -&gt; [a])<br> (\c cs&#39; -&gt; return (:) `ap` c `ap` cs&#39;) :: m a -&gt; m [a] -&gt; m [a]<br><br>therefore<br><br> sequence :: [ m a ] -&gt; m [a] <br>
<br>Perhaps a special tutorial interpreter would be of use, but I&#39;ve had some success simply passing in anonymous functions to ghci&#39;s :t operator, since that lets me simplify a program one bit at a time, inferring the types that might confuse me.<br>
</div></div>