Daniel,<br>I am still trying to figure out the order of function applications in the parser returning list of objects (I attached again the code to the end of this message for convenience).<br><br>You wrote:<br>(&gt;*&gt;) associates to the right, hence
<br>p &gt;*&gt; (p &gt;*&gt; (p &gt;*&gt; (... &gt;*&gt; (p &gt;*&gt; succeed [])...)))<br><br>I don&#39;t understand where (p &gt;*&gt; succeed []) comes from?<br>&nbsp;<br>Yet, if the order is as you describe, everything goes well, for example:
<br><br>comp1 = dig &gt;*&gt; dig&nbsp;&nbsp; has type&nbsp; - Parser char (char, char) <br>comp2 = dig &gt;*&gt; (succeed [])&nbsp; has type&nbsp; - Parser char (char, [a]) <br>pl1 = comp2 `build` (uncurry (:)) has type - Parser char (char, [char]) 
<br><br>At first run<br>(succeed []) `alt` ((p &gt;*&gt; pList p) `build` (uncurry (:)))<br><br>should be:<br>[] ++&nbsp; ((p &gt;*&gt; pList p) `build` (uncurry (:)))<br><br>so how we get:<br>(p &gt;*&gt; succeed []) ?<br>&nbsp;<br>
Thanks,<br>Dima<br><br><font size="-0"><span class="q"><div><font size="-0"><font size="-0"><span class="291181309-28032007"><div><font face="Arial" size="2"><span class="291181309-28032007"></span></font> ---</div></span>
</font></font></div>
<div><font face="Arial"><font size="2">module MyParser where</font></font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">import Data.Char</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">type Parse a b = [a] -&gt; [(b, [a])]</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">none :: Parse a b<br>none&nbsp; = \inp -&gt; 
[]</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">succeed :: b -&gt; Parse a b<br>succeed val = \inp 
-&gt; [(val, inp)]</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">spot :: (a -&gt; Bool) -&gt; Parse a a<br>spot p = 
\inp -&gt; case inp of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [] -&gt; []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(x:xs) -&gt; if (p x) then [(x, xs)] else []&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">alt :: Parse a b -&gt; Parse a b -&gt; Parse a 
b<br>alt p1 p2 = \inp -&gt; p1 inp ++ p2 inp</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">bracket = spot (==&#39;(&#39;)<br>dash = spot (== 
&#39;-&#39;)<br>dig = spot isDigit<br>alpha = spot isAlpha</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">infixr 5 &gt;*&gt;</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">(&gt;*&gt;) :: Parse a b -&gt; Parse a c -&gt; 
Parse a (b, c)<br>(&gt;*&gt;) p1 p2 = \inp -&gt; [((x,y), rem2) |(x, rem1) &lt;- 
p1 inp, (y, rem2) &lt;- p2 rem1]</font></div>
<div>&nbsp;</div>
<div><br><font face="Arial" size="2">build 
:: Parse a b -&gt; (b -&gt; c) -&gt; Parse a c<br>build p f = \inp -&gt; [ (f x, 
rem) | (x, rem) &lt;- p inp] </font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">pList :: Parse a b -&gt; Parse a [b]<br>pList p = 
(succeed []) `alt`<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((p &gt;*&gt; pList p) `build` (uncurry 
(:)))</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">comp1 = dig &gt;*&gt; dig <br>comp2 = dig &gt;*&gt; 
(succeed [])<br>pl1 = comp<span class="291181309-28032007">2&nbsp;</span> `build` 
(uncurry (:))</font></div>
<div>&nbsp;</div>
<div><font face="Arial" size="2">test = pList dig </font></div>
<div>&nbsp;</div>

<div>On 3/28/07, <b class="gmail_sendername">Daniel Fischer</b> &lt;<a href="mailto:daniel.is.fischer@web.de">daniel.is.fischer@web.de</a>&gt; wrote:</div></span></font><div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Am Dienstag, 27. März 2007 12:15 schrieb Dmitri O.Kondratiev:<br>&gt; Thanks Daniel!<br>&gt; Things are getting more in shape, yet I still can not fully comprehend the<br>&gt; expression:<br>&gt;<br>&gt; ((p &gt;*&gt; pList p) `build` (uncurry (:)))
<br>&gt;<br>&gt; where<br>&gt;<br>&gt;&nbsp;&nbsp;(&gt;*&gt;) :: Parse a b -&gt; Parse a c -&gt; Parse a (b, c)<br>&gt;&nbsp;&nbsp;(&gt;*&gt;) p1 p2 inp = [((x,y), rem2) |(x, rem1) &lt;- p1 inp, (y, rem2) &lt;- p2<br>&gt; rem1]<br>&gt;<br>&gt;&nbsp;&nbsp;build :: Parse a b -&gt; (b -&gt; c) -&gt; Parse a c
<br>&gt;&nbsp;&nbsp;build p f inp = [ (f x, rem) | (x, rem) &lt;- p inp]<br>&gt;<br>&gt; So in fact recursive application:<br>&gt;<br>&gt; p &gt;*&gt; pList p<br>&gt;<br>&gt; should unfold in something like:<br>&gt;<br>&gt; ((p &gt;*&gt; p) &gt;*&gt; p) &gt;*&gt; p ...
<br><br>(&gt;*&gt;) associates to the right, hence<br>p &gt;*&gt; (p &gt;*&gt; (p &gt;*&gt; (... &gt;*&gt; (p &gt;*&gt; succeed [])...)))<br><br>&gt;<br>&gt; and *all*&nbsp;&nbsp;iterations of<br>&gt;<br>&gt; p &gt;*&gt; pList p<br>
&gt;<br>&gt; will be done *before* &#39;build&#39; will be applied?<br>&gt;<br>&gt; Correct?<br><br>Think so. Though it might be conceivable that &#39;build&#39; would be partially<br>applied before.<br>After p has parsed the first item x1, leaving the remainder rem of the input,
<br>we can see that the result will be<br>[(x1:lst,rem2) | (lst,rem2) &lt;- pList p rem]<br>and we know that pList p never fails, due to &#39;succeed []&#39;, so that would be<br>more efficient than constructing and destroying a lot of pairs.
<br>I&#39;ve no idea whether a compiler would do that transformation, though I&#39;d be<br>interested to know.<br>&gt;<br>&gt; Thanks,<br>&gt; Dima<br>&gt;<br>Cheers,<br>Daniel<br><br></blockquote></div><br>