&gt; two uses of the same data constructor in an expression will not unify those type variables because it&#39;s scoped to the data constructor itself<br><br>Which is somewhat clearer when using GADTs:<br><span style="font-family:courier new,monospace">data LegGram t s where</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">    LegGram :: Ord nt =&gt; M.Map nt [RRule nt t s] -&gt; LegGram t s<br><br><span style="font-family:arial,helvetica,sans-serif">Here, as the LegGram data constructor is a function, it follows their rules, then is equivalent to:<br>

</span></span><span style="font-family:courier new,monospace">LegGram :: forall nt. Ord nt =&gt; M.Map nt [RRule nt t s] -&gt; LegGram t s<br><br style="font-family:arial,helvetica,sans-serif"><span style="font-family:arial,helvetica,sans-serif">Which clearly indicated that &#39;nt&#39; only exists within the scope of a variable.<br>

<br>However, GADTs add some ambiguity:<br></span></span><span style="font-family:courier new,monospace">data LegGram <b>t</b> <b>s</b> where</span><br><span style="font-family:courier new,monospace"><span style="font-family:arial,helvetica,sans-serif">It&#39;s not easy for a beginner to see that those type variables are <b>not </b>the same than those:<br>

</span></span><span style="font-family:courier new,monospace">LegGram :: Ord nt =&gt; M.Map nt [RRule nt <b>t s</b>] -&gt; LegGram <b>t s</b></span><br><br>So, for short:<br>data Something a b c = ... -- ^ Regular ADT, a b and c are brought into scope<br>

<br>data Something a b c where ... -- ^ GADT, a b and c <b>are not </b>scoped, their name is useless, their use is only to indicate the arity of the type constructor. But we have kinds for that.<br><br>I find it misleading. To me, it should be compulsory to write:<br>

data Something :: * -&gt; * -&gt; * where ...<br>would be better, but I believe it requires another language extension.<br><br><div class="gmail_quote">2012/1/3 Brandon Allbery <span dir="ltr">&lt;<a href="mailto:allbery.b@gmail.com">allbery.b@gmail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="im">On Tue, Jan 3, 2012 at 06:43, Yves Parès <span dir="ltr">&lt;<a href="mailto:limestrael@gmail.com" target="_blank">limestrael@gmail.com</a>&gt;</span> wrote:<br>

</div><div class="gmail_quote"><div class="im"><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
That is error-prone.<br>Plus the code does not need ScopedTypeVariables. The real problem comes from the use of a class constraint on the LegGram data constructor.<br><br><span style="font-family:courier new,monospace">data LegGram nt t s = Ord nt =&gt; LegGram (M.Map nt [RRule nt t s])<br>




<br><font face="arial,helvetica,sans-serif">Short answer: you <b>can&#39;t </b>add class constraints to an already declared type variable:<br><br>The LegGram <b>type </b>constructor declares the &#39;nt&#39; variable (and then brings it into scope), so trying afterwards to add a constraint to it for the LegGram <b>data </b>constructor is invalid, so the compiler understands this:<br>




</font></span><span style="font-family:courier new,monospace">data LegGram nt t s = <b>forall nt.</b> Ord nt =&gt; LegGram (M.Map <b>nt</b> [RRule <b>nt</b> t s])</span><br><font><font face="&#39;courier new&#39;, monospace">...the declaration and scoping of a </font><b style="font-family:&#39;courier new&#39;,monospace">new</b><font face="&#39;courier new&#39;, monospace"> type variable.</font><br>




<br><font face="&#39;courier new&#39;, monospace">This is it, right?</font></font></blockquote><div><br></div></div><div>Yep, with the additional gotcha that two uses of the same data constructor in an expression will not unify those type variables because it&#39;s scoped to the data constructor itself.  Which is the confusing and error-prone behavior that led to it being removed from the next version of the standard (probably; the proposal was accepted but H&#39;2011 was bypassed and H&#39;2012 has not yet started).</div>


<div><br></div></div><div class="im">-- <br>brandon s allbery                                      <a href="mailto:allbery.b@gmail.com" target="_blank">allbery.b@gmail.com</a><br>wandering unix systems administrator (available)     (412) 475-9364 vm/sms<br>


<br>
</div></div>
</blockquote></div><br>