Add flag -XExplicitForAll and document it
authorsimonpj@microsoft.com <unknown>
Wed, 7 Oct 2009 15:52:51 +0000 (15:52 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 7 Oct 2009 15:52:51 +0000 (15:52 +0000)
This implements the Haskell Prime proposal
  http://hackage.haskell.org/trac/haskell-prime/wiki/ExplicitForall

Flag is -XExplicitForAll

Implied by Opt_RankNTypes, Opt_Rank2Types, Opt_ScopedTypeVariables,
           Opt_LiberalTypeSynonyms, Opt_ExistentialQuantification,
           Opt_PolymorphicComponents

compiler/main/DynFlags.hs
compiler/parser/Lexer.x
compiler/rename/RnEnv.lhs
docs/users_guide/flags.xml
docs/users_guide/glasgow_exts.xml

index 46c9d20..3188658 100644 (file)
@@ -256,6 +256,7 @@ data DynFlag
    | Opt_TypeOperators
    | Opt_PackageImports
    | Opt_NewQualifiedOperators
+   | Opt_ExplicitForAll
 
    | Opt_PrintExplicitForalls
 
@@ -1816,6 +1817,7 @@ xFlags = [
   ( "NPlusKPatterns",                   Opt_NPlusKPatterns, const Supported ),
   -- On by default (which is not strictly H98):
   ( "MonoPatBinds",                     Opt_MonoPatBinds, const Supported ),
+  ( "ExplicitForAll",                   Opt_ExplicitForAll, const Supported ),
   ( "MonoLocalBinds",                   Opt_MonoLocalBinds, const Supported ),
   ( "RelaxedPolyRec",                   Opt_RelaxedPolyRec, const Supported ),
   ( "ExtendedDefaultRules",             Opt_ExtendedDefaultRules, const Supported ),
@@ -1847,7 +1849,14 @@ xFlags = [
 
 impliedFlags :: [(DynFlag, DynFlag)]
 impliedFlags
-  = [ (Opt_GADTs,               Opt_RelaxedPolyRec)  -- We want type-sig variables to
+  = [ (Opt_RankNTypes,                Opt_ExplicitForAll)
+    , (Opt_Rank2Types,                Opt_ExplicitForAll)
+    , (Opt_ScopedTypeVariables,       Opt_ExplicitForAll)
+    , (Opt_LiberalTypeSynonyms,       Opt_ExplicitForAll)
+    , (Opt_ExistentialQuantification, Opt_ExplicitForAll)
+    , (Opt_PolymorphicComponents,     Opt_ExplicitForAll)
+
+    , (Opt_GADTs,               Opt_RelaxedPolyRec)  -- We want type-sig variables to
                                                      --      be completely rigid for GADTs
 
     , (Opt_TypeFamilies,        Opt_RelaxedPolyRec)  -- Trac #2944 gives a nice example
index 675b4d6..fe5c693 100644 (file)
@@ -1753,26 +1753,21 @@ mkPState buf loc flags  =
     }
     where
       bitmap = genericsBit `setBitIf` dopt Opt_Generics flags
-              .|. ffiBit       `setBitIf` dopt Opt_ForeignFunctionInterface flags
-              .|. parrBit      `setBitIf` dopt Opt_PArr         flags
-              .|. arrowsBit    `setBitIf` dopt Opt_Arrows       flags
-              .|. thBit        `setBitIf` dopt Opt_TemplateHaskell flags
-              .|. qqBit        `setBitIf` dopt Opt_QuasiQuotes flags
-              .|. ipBit        `setBitIf` dopt Opt_ImplicitParams flags
-              .|. explicitForallBit `setBitIf` dopt Opt_ScopedTypeVariables flags
-              .|. explicitForallBit `setBitIf` dopt Opt_LiberalTypeSynonyms flags
-              .|. explicitForallBit `setBitIf` dopt Opt_PolymorphicComponents flags
-              .|. explicitForallBit `setBitIf` dopt Opt_ExistentialQuantification flags
-              .|. explicitForallBit `setBitIf` dopt Opt_Rank2Types flags
-              .|. explicitForallBit `setBitIf` dopt Opt_RankNTypes flags
-              .|. bangPatBit   `setBitIf` dopt Opt_BangPatterns flags
-              .|. tyFamBit     `setBitIf` dopt Opt_TypeFamilies flags
-              .|. haddockBit   `setBitIf` dopt Opt_Haddock      flags
-              .|. magicHashBit `setBitIf` dopt Opt_MagicHash    flags
-              .|. kindSigsBit  `setBitIf` dopt Opt_KindSignatures flags
-              .|. recursiveDoBit `setBitIf` dopt Opt_RecursiveDo flags
-              .|. unicodeSyntaxBit `setBitIf` dopt Opt_UnicodeSyntax flags
-              .|. unboxedTuplesBit `setBitIf` dopt Opt_UnboxedTuples flags
+              .|. ffiBit            `setBitIf` dopt Opt_ForeignFunctionInterface flags
+              .|. parrBit           `setBitIf` dopt Opt_PArr         flags
+              .|. arrowsBit         `setBitIf` dopt Opt_Arrows       flags
+              .|. thBit             `setBitIf` dopt Opt_TemplateHaskell flags
+              .|. qqBit             `setBitIf` dopt Opt_QuasiQuotes flags
+              .|. ipBit             `setBitIf` dopt Opt_ImplicitParams flags
+              .|. explicitForallBit `setBitIf` dopt Opt_ExplicitForAll flags
+              .|. bangPatBit        `setBitIf` dopt Opt_BangPatterns flags
+              .|. tyFamBit          `setBitIf` dopt Opt_TypeFamilies flags
+              .|. haddockBit        `setBitIf` dopt Opt_Haddock      flags
+              .|. magicHashBit      `setBitIf` dopt Opt_MagicHash    flags
+              .|. kindSigsBit       `setBitIf` dopt Opt_KindSignatures flags
+              .|. recursiveDoBit    `setBitIf` dopt Opt_RecursiveDo flags
+              .|. unicodeSyntaxBit  `setBitIf` dopt Opt_UnicodeSyntax flags
+              .|. unboxedTuplesBit  `setBitIf` dopt Opt_UnboxedTuples flags
               .|. standaloneDerivingBit `setBitIf` dopt Opt_StandaloneDeriving flags
                .|. transformComprehensionsBit `setBitIf` dopt Opt_TransformListComp flags
                .|. rawTokenStreamBit `setBitIf` dopt Opt_KeepRawTokenStream flags
index 64e299e..20d2218 100644 (file)
@@ -1089,7 +1089,7 @@ unknownNameErr rdr_name
 
 perhapsForallMsg :: SDoc
 perhapsForallMsg 
-  = vcat [ ptext (sLit "Perhaps you intended to use -XRankNTypes or similar flag")
+  = vcat [ ptext (sLit "Perhaps you intended to use -XExplicitForAll or similar flag")
         , ptext (sLit "to enable explicit-forall syntax: forall <tvs>. <type>")]
 
 unknownSubordinateErr :: SDoc -> RdrName -> SDoc
index b87044f..aae0f59 100644 (file)
              <entry><option>-XNoNewQualifiedOperators</option></entry>
            </row>
            <row>
+             <entry><option>-XExplicitForALl</option></entry>
+             <entry>Enable <link linkend="explicit-foralls">explicit universal quantification</link>.
+              Implied by <option>-XScopedTypeVariables</option>,
+           <option>-XLiberalTypeSynonyms</option>,
+           <option>-XRank2Types</option>,
+           <option>-XRankNTypes</option>,
+           <option>-XPolymorphicComponents</option>,
+           <option>-XExistentialQuantification</option>
+              </entry>
+             <entry>dynamic</entry>
+             <entry><option>-XNoExplicitForAll</option></entry>
+           </row>
+           <row>
              <entry><option>-XPolymorphicComponents</option></entry>
              <entry>Enable <link linkend="universal-quantification">polymorphic components for data constructors</link>.</entry>
              <entry>dynamic</entry>
index befb416..093858b 100644 (file)
@@ -78,6 +78,7 @@ documentation</ulink> describes all the libraries that come with GHC.
           <option>-XPostfixOperators</option>,
           <option>-XPatternGuards</option>,
           <option>-XLiberalTypeSynonyms</option>,
+          <option>-XExplicitForAll</option>,
           <option>-XRankNTypes</option>,
           <option>-XImpredicativeTypes</option>,
           <option>-XTypeOperators</option>,
@@ -1664,7 +1665,8 @@ The following syntax is stolen:
           <indexterm><primary><literal>forall</literal></primary></indexterm>
        </term>
        <listitem><para>
-       Stolen (in types) by: <option>-XScopedTypeVariables</option>,
+       Stolen (in types) by: <option>-XExplicitForAll</option>, and hence by
+            <option>-XScopedTypeVariables</option>,
            <option>-XLiberalTypeSynonyms</option>,
            <option>-XRank2Types</option>,
            <option>-XRankNTypes</option>,
@@ -4713,10 +4715,30 @@ might be in another module, or even in a module that is not yet written.
 <sect1 id="other-type-extensions">
 <title>Other type system extensions</title>
 
-<sect2 id="type-restrictions">
-<title>Type signatures</title>
+<sect2 id="explicit-foralls"><title>Explicit universal quantification (forall)</title>
+<para>
+Haskell type signatures are implicitly quantified.  When the language option <option>-XExplicitForAll</option>
+is used, the keyword <literal>forall</literal>
+allows us to say exactly what this means.  For example:
+</para>
+<para>
+<programlisting>
+        g :: b -> b
+</programlisting>
+means this:
+<programlisting>
+        g :: forall b. (b -> b)
+</programlisting>
+The two are treated identically.
+</para>
+<para>
+Of course <literal>forall</literal> becomes a keyword; you can't use <literal>forall</literal> as
+a type variable any more!
+</para>
+</sect2>
+
 
-<sect3 id="flexible-contexts"><title>The context of a type signature</title>
+<sect2 id="flexible-contexts"><title>The context of a type signature</title>
 <para>
 The <option>-XFlexibleContexts</option> flag lifts the Haskell 98 restriction
 that the type-class constraints in a type signature must have the 
@@ -4745,7 +4767,7 @@ Consider the type:
 language omits them; in Haskell 98, all the free type variables of an
 explicit source-language type signature are universally quantified,
 except for the class type variables in a class declaration.  However,
-in GHC, you can give the foralls if you want.  See <xref linkend="universal-quantification"/>).
+in GHC, you can give the foralls if you want.  See <xref linkend="explicit-foralls"/>).
 </para>
 
 <para>
@@ -4833,9 +4855,6 @@ territory free in case we need it later.
 </orderedlist>
 
 </para>
-</sect3>
-
-
 
 </sect2>
 
@@ -5313,22 +5332,7 @@ The parentheses are required.
 </title>
 
 <para>
-Haskell type signatures are implicitly quantified.  The new keyword <literal>forall</literal>
-allows us to say exactly what this means.  For example:
-</para>
-<para>
-<programlisting>
-        g :: b -> b
-</programlisting>
-means this:
-<programlisting>
-        g :: forall b. (b -> b)
-</programlisting>
-The two are treated identically.
-</para>
-
-<para>
-However, GHC's type system supports <emphasis>arbitrary-rank</emphasis> 
+GHC's type system supports <emphasis>arbitrary-rank</emphasis> 
 explicit universal quantification in
 types. 
 For example, all the following types are legal:
@@ -5383,8 +5387,6 @@ field type signatures.</para> </listitem>
 </itemizedlist>
 </para></listitem>
 </itemizedlist>
-Of course <literal>forall</literal> becomes a keyword; you can't use <literal>forall</literal> as
-a type variable any more!
 </para>