Why has the operator (.) troubles with a type like (forall s. ST s a)?<br><br>Why can&#39;t it match the type &#39;b&#39; in (.) definition?<br><br><br><div class="gmail_quote">2011/3/10 Daniel Fischer <span dir="ltr">&lt;<a href="mailto:daniel.is.fischer@googlemail.com">daniel.is.fischer@googlemail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">On Thursday 10 March 2011 14:18:24, Anakim Border wrote:<br>
&gt; Dear list,<br>
&gt;<br>
&gt; I have the following (simplified) piece of code:<br>
&gt;<br>
&gt; find :: Int -&gt; [Int]<br>
&gt; find i = runST . (`runContT` return) $<br>
&gt;   callCC $ \escape -&gt; do<br>
&gt;     return []<br>
&gt;<br>
&gt; which used to compile correctly under GHC 6.12.3.<br>
&gt;<br>
&gt; Now that I&#39;ve switched to 7.0.2 it gets rejected with the following<br>
&gt; error:<br>
&gt;<br>
&gt;     Couldn&#39;t match expected type `forall s. ST s c0&#39;<br>
&gt;                 with actual type `m0 r0&#39;<br>
&gt;     Expected type: ContT r0 m0 a0 -&gt; forall s. ST s c0<br>
&gt;       Actual type: ContT r0 m0 a0 -&gt; m0 r0<br>
&gt;     In the second argument of `(.)&#39;, namely `(`runContT` return)&#39;<br>
&gt;     In the expression: runST . (`runContT` return)<br>
&gt;<br>
&gt;<br>
&gt; I&#39;m a little bit lost at what exactly is the problem.<br>
<br>
</div>If memory serves correctly, it&#39;s impredicative polymorphism.<br>
<br>
The type of (.), (b -&gt; c) -&gt; (a -&gt; b) -&gt; a -&gt; c,  can&#39;t handle<br>
(x -&gt; forall s. ST s [Int])<br>
<br>
Previously there was an implementation of impredicative polymorphism which<br>
allowed GHC to handle that construct, but that has been removed (because it<br>
was unsatisfactory), so GHC 7 doesn&#39;t compile that anymore.<br>
<div class="im"><br>
&gt; Anyone can suggest a solution?<br>
<br>
</div>Parentheses.<br>
<div class="im"><br>
find i = runST ((`runContT` return) $<br>
    callCC $ \escape -&gt; do<br>
</div>       return [])<br>
<div><div></div><div class="h5"><br>
&gt;<br>
&gt; Thanks!<br>
&gt;<br>
&gt; AB<br>
<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>