Hi everyone,<br>I&#39;ve been playing with the parsers decribed in &quot;Monadic Parser Combinators&quot; (<a href="http://www.cs.nott.ac.uk/~gmh/bib.html#monparsing">http://www.cs.nott.ac.uk/~gmh/bib.html#monparsing</a>) and I&#39;ve gotten stumped.&nbsp; I&#39;m trying to get comfortable working monadically, so please excuse my ignorance.&nbsp; Here&#39;s the relevant portions of my code:
<br><br>data Parser a = Parser { parse :: (String -&gt; [(a, String)]) }<br><br>instance Monad Parser where<br>&nbsp;&nbsp;&nbsp; return v = Parser (\inp -&gt; [(v, inp)])<br>&nbsp;&nbsp;&nbsp; par@(Parser p) &gt;&gt;= f =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser (\inp -&gt; concat [parse (f v) out | (v, out) &lt;- p inp])
<br><br>instance MonadPlus Parser where<br>&nbsp;&nbsp;&nbsp; mzero = Parser (\inp -&gt; [])<br>&nbsp;&nbsp;&nbsp; p `mplus` q = Parser (\inp -&gt; (parse p inp ++ parse q inp))<br><br>item :: Parser Char<br>item = Parser (\inp -&gt; case inp of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (x:xs) -&gt; [(x, xs)])<br><br>sat :: (Char -&gt; Bool) -&gt; Parser Char<br>sat p = Parser (\inp -&gt; [ (v, out) | (v, out) &lt;- parse item inp, p v])<br><br>lower :: Parser Char<br>lower = Parser (\inp -&gt; parse (sat (\x -&gt; &#39;a&#39; &lt;= x &amp;&amp; x &lt;= &#39;z&#39;)) inp)
<br><br>upper :: Parser Char<br>upper = Parser (\inp -&gt; parse (sat (\x -&gt; &#39;A&#39; &lt;= x &amp;&amp; x &lt;= &#39;Z&#39;)) inp)<br><br>letter :: Parser Char<br>letter = lower `mplus` upper<br><br>-- word parses everything as []
<br>word :: Parser String<br>word = mzero `mplus` do<br>&nbsp; x &lt;- letter;<br>&nbsp; xs &lt;- word;<br>&nbsp; return (x:xs)<br><br>As I noted in the code, no matter what inputs I give it,<br>&gt; parse word &quot;blah blah&quot;<br>
always returns [].&nbsp; Any ideas where where my misunderstanding is?<br><br>David<br><br>