<div dir="ltr">On Sat, Oct 29, 2011 at 16:18, Bas van Dijk <span dir="ltr">&lt;<a href="mailto:v.dijk.bas@gmail.com">v.dijk.bas@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
type Run t = ∀ n β. Monad n ⇒ t n β → n (St t β)<br>
<br>
foo :: (Monad m, MonadTransControl t) =&gt; (Run t -&gt; m α) -&gt; t m α<br>
foo f = liftControl f<br>
<br>
Type checking &#39;foo&#39; this gives the following error:<br>
<br>
    Couldn&#39;t match expected type `Run t&#39; with actual type `Run t&#39;<br>
 </blockquote><div><br></div><div>I *think* this might be odd reporting combined with an expected behavior:  since the forall is embedded in the &quot;type&quot; declaration, the &quot;t&quot; inside the parens is not the same as the one outside (because each one has its own &quot;forall&quot; associated with it).  If the type is inferred, the inference gets the association right, but the explicit &quot;forall&quot; from the definition of (Run t) used inside the parens tells ghc that they should be different.</div>
<div><br></div><div>(I *think* this might mean manually expanding &quot;Run t&quot; and moving the &quot;forall&quot; to the outer scope, but now we&#39;re into territory I don&#39;t understand very well.)</div><div><br></div>
</div>-- <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>