Given a newtype declaration:<br>
<br>
<span style="font-family: courier new,monospace;">newtype Foo a = Bar (...)</span><br style="font-family: courier new,monospace;">
<br>
The newtype is Foo a, and it uses a constructor Bar, which gets &#39;erased&#39; at compile time, unlike a data declaration. By convention, usually Foo and Bar are the same thing. In this case the constructor for GenParser is named Parser instead.<br>
<br>To understand the GenParser type, you must consider that originally, &#39;GenParser&#39; probably didn&#39;t exist. And if it did, there is a pedagogical justification to just explaining the simpler &#39;Parser&#39; case first without appealing to the notion of a parser in its full generality.<br>
<br>So if you started from a type like<br><br><span style="font-family: courier new,monospace;">newtype Parser a = Parser (State Char () -&gt; Consumed (Reply Char () a))</span><br style="font-family: courier new,monospace;">
<br>and later want to generalize that to a more permissive signature, without breaking all of the code that uses that constructor, then the upgrade path for that code is to keep the same constructor name, but generalize the type.<br>
<br>So Parser becomes a type alias:<br><br><span style="font-family: courier new,monospace;">type Parser = GenParser Char ()</span><br style="font-family: courier new,monospace;"><br>and GenParser is introduced as a newtype, which happens to use the constructor Parser for the dual reasons of backwards compatibility and so that people working on simple parsers don&#39;t need to think about alternative user state and token types.<br>
<br><span style="font-family: courier new,monospace;">newtype GenParser tok st a = Parser (State tok st -&gt; Consumed (Reply tok st</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">
a))</span><br style="font-family: courier new,monospace;">
<br>Now the only thing that breaks is that any code that previously defined instances for Parser before the notion of GenParser must add a LANGUAGE pragma indicating that <code class="option">TypeSynonymInstances</code> are allowed.<br>
<br>-Edward Kmett<br><br><div class="gmail_quote">On Thu, Nov 5, 2009 at 2:17 AM, zaxis <span dir="ltr">&lt;<a href="mailto:z_axis@163.com">z_axis@163.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
type Parser a = GenParser Char () a<br>
newtype GenParser tok st a = Parser (State tok st -&gt; Consumed (Reply tok st<br>
a))<br>
<br>
As i know, the Parser type is just an alias of GenParser. Then ┬ácan the<br>
second line be replaced as below?<br>
<br>
newtype GenParser tok st a = GenParser Char () (State tok st -&gt; Consumed<br>
(Reply tok st a))<br>
<br>
If it can , then what is the new type ?<br>
<br>
Sincerely!<br>
<br>
-----<br>
fac n = foldr (*) 1 [1..n]<br>
<font color="#888888">--<br>
View this message in context: <a href="http://old.nabble.com/What%27s-the-new-type---tp26208600p26208600.html" target="_blank">http://old.nabble.com/What%27s-the-new-type---tp26208600p26208600.html</a><br>
Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.<br>
</font><div><div></div><div class="h5"><br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>