Thanks all of your for your time and your interesting examples. Now I
can see that my problem is parsing a String. I am new in Haskell, so, I
start to study parsing and how to create a parser from beginning.<br>
<br>
I start with an example from the book as follows:<br>
%The parser item fails if the input is empty and consumes the first character otherwise.<br>
<br>\begin{code}<br>
newtype Parser a = Parser(String -&gt; [(a, String)])<br>
<br>
item::Parser Char<br>
item = Parser(\cs -&gt; case cs of<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;&quot;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; []<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (c:cs) -&gt; [(c,cs)])<br>
<br>
parse :: Parser a -&gt; String -&gt; [(a, String)]<br>
parse p cs = p cs<br>
\end{code}<br><br>
and I compile, the error displays. I do not know how to fix it. Please help me.<br>
<br>
$ghci parser.lhs<br>
parser.lhs:10:13:<br>
&nbsp;&nbsp;&nbsp; Couldn't match `Parser a' against `t -&gt; t1'<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Expected type: Parser a<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Inferred type: t -&gt; t1<br>
&nbsp;&nbsp;&nbsp; Probable cause: `p' is applied to too many arguments in the call (p cs)<br>
&nbsp;&nbsp;&nbsp; In the definition of `parse': parse p cs = p cs<br>
Failed, modules loaded: none.<br>
<br>
<br><br><div><span class="gmail_quote">On 10/14/05, <b class="gmail_sendername">Ralf Hinze</b> &lt;<a href="mailto:ralf@informatik.uni-bonn.de">ralf@informatik.uni-bonn.de</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Hi Huong,<br><br>attached you find a small program for parsing values of various (data)<br>types. It uses a generalized algebraic data type for representing types<br>and a universal data type for representing values. The parser itself is
<br>rather simple-minded: it builds on Haskell's &quot;ReadS&quot; type.<br><br>I don't know whether this is what you are after, but it was fun writing.<br>There are many opportunities for improvement: one could use a decent
<br>combinator library for parsing; a type of dynamic values instead of a<br>universal type etc.<br><br>Here are some example calls:<br><br>Main&gt; parseAny &quot;4711&quot;<br>[(ValInt 4711,&quot;&quot;)]<br>Main&gt; parseAny &quot;\&quot;4711\&quot;&quot;
<br>[(ValString &quot;4711&quot;,&quot;&quot;)]<br>Main&gt; parseAny &quot;[4711, 0]&quot;<br>[(ValList [ValInt 4711,ValInt 0],&quot;&quot;)]<br>Main&gt; parseAny &quot;[4711, 'a']&quot;<br>[(ValList [ValInt 4711,ValChar 'a'],&quot;&quot;)]
<br>Main&gt; parseAny &quot;[\&quot;hello world\&quot;]&quot;<br>[(ValList [ValString &quot;hello world&quot;],&quot;&quot;)]<br><br>Note that &quot;parseAny&quot; even parses heterogenous lists.<br><br>Cheers, Ralf<br><br>

---<br><br>&gt; {-# OPTIONS -fglasgow-exts #-}<br><br>&gt; data Type :: * -&gt; * where<br>&gt;&nbsp;&nbsp; Char&nbsp;&nbsp;&nbsp;&nbsp;:: Type Char<br>&gt;&nbsp;&nbsp; Int&nbsp;&nbsp;&nbsp;&nbsp; :: Type Int<br>&gt;&nbsp;&nbsp; List&nbsp;&nbsp;&nbsp;&nbsp;:: Type a -&gt; Type [a]<br>&gt;&nbsp;&nbsp; Value&nbsp;&nbsp; :: Type Value
<br><br>&gt; string :: Type String<br>&gt; string&nbsp;&nbsp;=&nbsp;&nbsp;List Char<br><br>&gt; parse :: Type t -&gt; ReadS t<br>&gt; parse (Char)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;reads<br>&gt; parse (Int)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;reads<br>&gt; parse (List Char)&nbsp;&nbsp;=&nbsp;&nbsp;reads<br>&gt; parse (List a)&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;parseList (parse (a))
<br>&gt; parse (Value)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;parseAny<br><br>&gt; data Value<br>&gt;&nbsp;&nbsp; =&nbsp;&nbsp;ValChar&nbsp;&nbsp;&nbsp;&nbsp;Char<br>&gt;&nbsp;&nbsp; |&nbsp;&nbsp;ValInt&nbsp;&nbsp;&nbsp;&nbsp; Int<br>&gt;&nbsp;&nbsp; |&nbsp;&nbsp;ValString&nbsp;&nbsp;String<br>&gt;&nbsp;&nbsp; |&nbsp;&nbsp;ValList&nbsp;&nbsp;&nbsp;&nbsp;[Value]<br>&gt;&nbsp;&nbsp; deriving (Show)<br><br>&gt; parseAny
<br>&gt;&nbsp;&nbsp; =&nbsp;&nbsp; ValChar&nbsp;&nbsp; &lt;$&gt; parse Char<br>&gt;&nbsp;&nbsp; &lt;+&gt; ValInt&nbsp;&nbsp;&nbsp;&nbsp;&lt;$&gt; parse Int<br>&gt;&nbsp;&nbsp; &lt;+&gt; ValString &lt;$&gt; parse string<br>&gt;&nbsp;&nbsp; &lt;+&gt; ValList&nbsp;&nbsp; &lt;$&gt; parse (List Value)<br><br>Helper functions.
<br><br>&gt; parseList parsea<br>&gt;&nbsp;&nbsp; =&nbsp;&nbsp;readParen False (\ s -&gt; [ xs | (&quot;[&quot;, t) &lt;- lex s, xs &lt;- parsel t ])<br>&gt;&nbsp;&nbsp; where parsel&nbsp;&nbsp;s&nbsp;&nbsp;=&nbsp;&nbsp; [ ([],&nbsp;&nbsp;&nbsp;&nbsp; t) | (&quot;]&quot;, t) &lt;- lex s ]<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;&nbsp;[
(x : xs, u) | (x,&nbsp;&nbsp; t) &lt;- parsea s,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(xs,&nbsp;&nbsp;u)
&lt;- parsel' t ]<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
parsel' s&nbsp;&nbsp;=&nbsp;&nbsp; [ ([],&nbsp;&nbsp;&nbsp;&nbsp; t) |
(&quot;]&quot;, t) &lt;- lex s ]<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++&nbsp;&nbsp;[
(x : xs, v) | (&quot;,&quot;, t) &lt;- lex s,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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,&nbsp;&nbsp;
u) &lt;- parsea t,<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(xs,&nbsp;&nbsp;v)
&lt;- parsel' u]<br><br>&gt; infix&nbsp;&nbsp;8&nbsp;&nbsp;&lt;$&gt;<br>&gt; infixr 6&nbsp;&nbsp;&lt;+&gt;<br>&gt; (f &lt;$&gt; p) s&nbsp;&nbsp;=&nbsp;&nbsp;[ (f a, t) | (a, t) &lt;- p s ]<br>&gt; (p &lt;+&gt; q) s&nbsp;&nbsp;=&nbsp;&nbsp;p s ++ q s<br></blockquote></div><br>