Improve error reporting for impredicative types
authorSimon Peyton Jones <simonpj@microsoft.com>
Tue, 21 Apr 2015 12:43:46 +0000 (13:43 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 22 Apr 2015 12:56:17 +0000 (13:56 +0100)
Don't suggest -XImpredicativeTypes; and document its flakiness
Fixes Trac #10325

compiler/typecheck/TcErrors.hs
compiler/typecheck/TcValidity.hs
docs/users_guide/glasgow_exts.xml
testsuite/tests/typecheck/should_fail/T10194.stderr
testsuite/tests/typecheck/should_fail/T2538.stderr
testsuite/tests/typecheck/should_fail/T7809.stderr
testsuite/tests/typecheck/should_fail/tcfail127.stderr
testsuite/tests/typecheck/should_fail/tcfail197.stderr

index 6b37e80..f32215b 100644 (file)
@@ -919,7 +919,7 @@ mkTyVarEqErr dflags ctxt extra ct oriented tv1 ty2
   = do { let msg = vcat [ ptext (sLit "Cannot instantiate unification variable")
                           <+> quotes (ppr tv1)
                         , hang (ptext (sLit "with a type involving foralls:")) 2 (ppr ty2)
-                        , nest 2 (ptext (sLit "Perhaps you want ImpredicativeTypes")) ]
+                        , nest 2 (ptext (sLit "GHC doesn't yet support impredicative polymorphism")) ]
        ; mkErrorMsgFromCt ctxt ct msg }
 
   -- If the immediately-enclosing implication has 'tv' a skolem, and
index d3000a6..53b492d 100644 (file)
@@ -360,7 +360,7 @@ data Rank = ArbitraryRank         -- Any rank ok
 
 rankZeroMonoType, tyConArgMonoType, synArgMonoType :: Rank
 rankZeroMonoType = MonoType (ptext (sLit "Perhaps you intended to use RankNTypes or Rank2Types"))
-tyConArgMonoType = MonoType (ptext (sLit "Perhaps you intended to use ImpredicativeTypes"))
+tyConArgMonoType = MonoType (ptext (sLit "GHC doesn't yet support impredicative polymorphism"))
 synArgMonoType   = MonoType (ptext (sLit "Perhaps you intended to use LiberalTypeSynonyms"))
 
 funArgResRank :: Rank -> (Rank, Rank)             -- Function argument and result
index 630f2b4..b594fe0 100644 (file)
@@ -8220,9 +8220,9 @@ for rank-2 types.
 <sect2 id="impredicative-polymorphism">
 <title>Impredicative polymorphism
 </title>
-<para>GHC supports <emphasis>impredicative polymorphism</emphasis>,
+<para>GHC has extremely flaky support for <emphasis>impredicative polymorphism</emphasis>,
 enabled with <option>-XImpredicativeTypes</option>.
-This means
+If it worked, this would mean
 that you can call a polymorphic function at a polymorphic type, and
 parameterise data structures over polymorphic types.  For example:
 <programlisting>
@@ -8233,11 +8233,11 @@ parameterise data structures over polymorphic types.  For example:
 Notice here that the <literal>Maybe</literal> type is parameterised by the
 <emphasis>polymorphic</emphasis> type <literal>(forall a. [a] ->
 [a])</literal>.
-</para>
-<para>The technical details of this extension are described in the paper
-<ulink url="http://research.microsoft.com/%7Esimonpj/papers/boxy/">Boxy types:
-type inference for higher-rank types and impredicativity</ulink>,
-which appeared at ICFP 2006.
+However <emphasis>the extension should be considered highly experimental, and certainly un-supported</emphasis>.
+You are welcome to try it, but please don't rely on it working consistently, or
+working the same in subsequent releases.  See 
+<ulink url="https://ghc.haskell.org/trac/ghc/wiki/ImpredicativePolymorphism">this wiki page</ulink>
+for more details.
 </para>
 </sect2>
 
index 53ee74b..7bc79b2 100644 (file)
@@ -1,7 +1,7 @@
 
-T10194.hs:7:8:
+T10194.hs:7:8: error:
     Cannot instantiate unification variable ‘b0’
     with a type involving foralls: X
-      Perhaps you want ImpredicativeTypes
+      GHC doesn't yet support impredicative polymorphism
     In the expression: (.)
     In an equation for ‘comp’: comp = (.)
index 884eafb..94583a4 100644 (file)
@@ -1,14 +1,14 @@
 
-T2538.hs:6:6:
+T2538.hs:6:6: error:
     Illegal polymorphic or qualified type: Eq a => a -> a
     Perhaps you intended to use RankNTypes or Rank2Types
     In the type signature for ‘f’: f :: (Eq a => a -> a) -> Int
 
-T2538.hs:9:6:
+T2538.hs:9:6: error:
     Illegal polymorphic or qualified type: Eq a => a -> a
-    Perhaps you intended to use ImpredicativeTypes
+    GHC doesn't yet support impredicative polymorphism
     In the type signature for ‘g’: g :: [Eq a => a -> a] -> Int
 
-T2538.hs:12:6:
+T2538.hs:12:6: error:
     Illegal polymorphic or qualified type: Eq a => a -> a
     In the type signature for ‘h’: h :: Ix (Eq a => a -> a) => Int
index e306f8d..153c4d1 100644 (file)
@@ -1,5 +1,5 @@
 
-T7809.hs:8:8:
+T7809.hs:8:8: error:
     Illegal polymorphic or qualified type: PolyId
-    Perhaps you intended to use ImpredicativeTypes
+    GHC doesn't yet support impredicative polymorphism
     In the type signature for ‘foo’: foo :: F PolyId
index d05a234..32af3d8 100644 (file)
@@ -1,5 +1,5 @@
 
-tcfail127.hs:3:8:
+tcfail127.hs:3:8: error:
     Illegal polymorphic or qualified type: Num a => a -> a
-    Perhaps you intended to use ImpredicativeTypes
+    GHC doesn't yet support impredicative polymorphism
     In the type signature for ‘foo’: foo :: IO (Num a => a -> a)
index 35d24e4..c15af60 100644 (file)
@@ -1,5 +1,5 @@
 
-tcfail197.hs:5:8:
+tcfail197.hs:5:8: error:
     Illegal polymorphic or qualified type: forall a. a
-    Perhaps you intended to use ImpredicativeTypes
+    GHC doesn't yet support impredicative polymorphism
     In the type signature for ‘foo’: foo :: [forall a. a] -> Int