Oleg explained why those work in his last post. It&#39;s the exact same logic for each one.<br><br>&gt; f :: a -&gt; a<br>
&gt; f x = x :: a<br><br>We explained that too: it&#39;s converted (alpha-converted, but I don&#39;t exactly know what &#39;alpha&#39; refers to. I guess it&#39;s phase the type inferer goes through) to:<br><br>f :: forall a. a -&gt; a<br>

f x = x :: forall a1. a1<br><br>On one side, x has type a, on the other, it has type a1. Those are different polymorphic types, yet it&#39;s the same variable x hence the incompatibility. So it doesn&#39;t type-check.<br>

<br><div class="gmail_quote">2012/1/4 Thiago Negri <span dir="ltr">&lt;<a href="mailto:evohunz@gmail.com">evohunz@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">

Do not compile:<br>
<div class="im"><br>
f :: a -&gt; a<br>
f x = x :: a<br>
<br>
</div>    Couldn&#39;t match type `a&#39; with `a1&#39;<br>
<div class="im">      `a&#39; is a rigid type variable bound by<br>
</div>          the type signature for f :: a -&gt; a at C:\teste.hs:4:1<br>
      `a1&#39; is a rigid type variable bound by<br>
           an expression type signature: a1 at C:\teste.hs:4:7<br>
<div class="im">    In the expression: x :: a<br>
</div>    In an equation for `f&#39;: f x = x :: a<br>
<br>
<br>
Any of these compiles:<br>
<div class="im"><br>
f :: a -&gt; a<br>
f x = undefined :: a<br>
<br>
</div>f :: Num a =&gt; a -&gt; a<br>
<div class="im">f x = undefined :: a<br>
<br>
</div>f :: Int -&gt; Int<br>
<div class="im">f x = undefined :: a<br>
<br>
</div>f :: Int -&gt; Int<br>
f x = 3 :: (Num a =&gt; a)<br>
<br>
<br>
Can someone explain case by case?<br>
<br>
Thanks,<br>
Thiago.<br>
<br>
2012/1/4 Yves Parès &lt;<a href="mailto:limestrael@gmail.com">limestrael@gmail.com</a>&gt;:<br>
<div class="HOEnZb"><div class="h5">&gt;&gt; I don&#39;t see the point in universally quantifying over types which are<br>
&gt; already present in the environment<br>
&gt;<br>
&gt; I think it reduces the indeterminacy you come across when you read your<br>
&gt; program (&quot;where does this type variable come from, btw?&quot;)<br>
&gt;<br>
&gt;<br>
&gt;&gt; So is there anyway to &quot;force&quot; the scoping of variables, so that<br>
&gt;&gt; f :: a -&gt; a<br>
&gt;&gt; f x = x :: a<br>
&gt;&gt; becomes valid?<br>
&gt;<br>
&gt; You mean either than compiling with ScopedTypeVariables and adding the<br>
&gt; explicit forall a. on f? I don&#39;t think.<br>
&gt;<br>
&gt; 2012/1/4 Brandon Allbery &lt;<a href="mailto:allbery.b@gmail.com">allbery.b@gmail.com</a>&gt;<br>
&gt;<br>
&gt; On Wed, Jan 4, 2012 at 08:41, Yves Parès &lt;<a href="mailto:limestrael@gmail.com">limestrael@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Would you try:<br>
&gt;&gt;<br>
&gt;&gt; f :: a -&gt; a<br>
&gt;&gt;<br>
&gt;&gt; f x = undefined :: a<br>
&gt;&gt;<br>
&gt;&gt; And tell me if it works? IMO it doesn&#39;t.<br>
&gt;<br>
&gt;&gt;  It won&#39;t<br>
&gt;<br>
&gt; Apparently, Yucheng says it does.<br>
&gt;<br>
</div></div><div class="HOEnZb"><div class="h5">&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
</div></div></blockquote></div><br>