Before uploading a new version of my project on Hackage, I decided to future-proof it against GHC 7.0. I ran into several compile errors caused by the  changes in let generalization, but these were easy to fix by adding extra type annotations. But then I ran into another problem that I can&#39;t fix so easily. Here is its trimmed-down reproduction:<br>
<br>&gt; {-# LANGUAGE RankNTypes #-}<br>&gt; <br>&gt; module Test where<br>&gt; <br>&gt; data Component c = Component {with :: c}<br>&gt; <br>
 &gt; pair1 :: (Bool -&gt; c1 -&gt; c2 -&gt; c3) -&gt; Component c1 -&gt; Component c2 -&gt; Component c3<br>&gt; pair1 combinator (Component c1) (Component c2) = Component (combinator True c1 c2)<br>&gt; <br>&gt; type PairBinder m = forall x y r. (x -&gt; y -&gt; m r) -&gt; m x -&gt; m y -&gt; m r<br>
&gt; <br>&gt; pair2 :: Monad m =&gt; (PairBinder m -&gt; c1 -&gt; c2 -&gt; c3) -&gt; Component c1 -&gt; Component c2 -&gt; Component c3<br>&gt; pair2 combinator = pair1 (combinator . chooseBinder)<br>&gt; <br>&gt; chooseBinder :: Monad m =&gt; Bool -&gt; PairBinder m<br>
&gt; chooseBinder right = if right then rightBinder else leftBinder<br>&gt; <br>&gt; leftBinder :: Monad m =&gt; PairBinder m<br>&gt; leftBinder f mx my = do {x &lt;- mx; y &lt;- my; f x y}<br>&gt; <br>&gt; rightBinder :: Monad m =&gt; PairBinder m<br>
&gt; rightBinder f mx my = do {y &lt;- my; x &lt;- mx; f x y}<br><br>   The general idea here, if you&#39;re intrigued, is that pair1 belongs to a generic module that packages things it knows nothing about into Components. The remaining definitions belong to a client of the generic module, and pair2 is a specialization of pair1 to components that have something to do with monads.<br>
<br>   Now this little test compiles fine with GHC 6.12.1, but GHC 7.0.0.20101029 reports the following error in the pair2 definition:<br><br>TestForall.lhs:13:42:<br>    Couldn&#39;t match expected type `forall x y r.<br>
                                  (x -&gt; y -&gt; m r) -&gt; m x -&gt; m y -&gt; m r&#39;<br>                with actual type `(x -&gt; y -&gt; m1 r) -&gt; m1 x -&gt; m1 y -&gt; m1 r&#39;<br>    Expected type: Bool -&gt; PairBinder m<br>
      Actual type: Bool -&gt; (x -&gt; y -&gt; m1 r) -&gt; m1 x -&gt; m1 y -&gt; m1 r<br>    In the second argument of `(.)&#39;, namely `chooseBinder&#39;<br>    In the first argument of `pair1&#39;, namely<br>      `(combinator . chooseBinder)&#39;<br>
<br>    I&#39;ve tried adding extra type annotations without making any progress. At this point I&#39;m beginning to suspect I ran into a bug in GHC 7.0, but I can&#39;t find it in GHC Trac; the only ticket that looks similar is #4347, but that one works for me. Is this a bug? If not, how do I make my code compile?<br>
<br>