<br><div class="gmail_quote">On Sat, Nov 14, 2009 at 17:55, Mark Lentczner wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Would I be correct in thinking: The difference between these two is that the type b can be &quot;fixed&quot; upon application of amy to the first two arguments (given context), whereas bob applied to two arguments MUST return a function that is applicable to every type.<br>


<br>
        amy :: Int -&gt; a -&gt; b -&gt; [Either a b]<br>
        bob :: Int -&gt; a -&gt; (forall b. b) -&gt; [Either a b]</blockquote></div><br>Here are the same functions using fresh variables where necessary plus an additional function:<br><br>  amy :: forall a b. Int -&gt; a -&gt; b -&gt; [Either a b]<br>

  bob :: forall a b. Int -&gt; a -&gt; (forall c. c) -&gt; [Either a b]<br>  cat :: forall a  . Int -&gt; a -&gt; (forall b. b -&gt; [Either a b])<br><br>First, note that the types of amy and cat are equivalent. Since function arrows are right-associative and since there are no conflicting variables b outside the scope of forall b, the quantification can easily be pushed to the outside as in amy. (I don&#39;t know if cat is what you meant to have for bob, so I thought I&#39;d add it just in case.)<br>

<br>As for bob, the only third argument it can take is bottom (undefined or error). And that argument has no effect on the types instantiated for a or b. (Using a fresh variable c helps make that more evident at a glance.)<br>

<br>Sean<br>