diff options
-rw-r--r-- | compiler/main/DynFlags.hs | 11 | ||||
-rw-r--r-- | compiler/parser/Lexer.x | 35 | ||||
-rw-r--r-- | compiler/rename/RnEnv.lhs | 2 | ||||
-rw-r--r-- | docs/users_guide/flags.xml | 13 | ||||
-rw-r--r-- | docs/users_guide/glasgow_exts.xml | 54 |
5 files changed, 67 insertions, 48 deletions
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 46c9d200ac..31886581f3 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -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 diff --git a/compiler/parser/Lexer.x b/compiler/parser/Lexer.x index 675b4d6fc0..fe5c693266 100644 --- a/compiler/parser/Lexer.x +++ b/compiler/parser/Lexer.x @@ -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 diff --git a/compiler/rename/RnEnv.lhs b/compiler/rename/RnEnv.lhs index 64e299e876..20d221857f 100644 --- a/compiler/rename/RnEnv.lhs +++ b/compiler/rename/RnEnv.lhs @@ -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 diff --git a/docs/users_guide/flags.xml b/docs/users_guide/flags.xml index b87044f5ac..aae0f59de5 100644 --- a/docs/users_guide/flags.xml +++ b/docs/users_guide/flags.xml @@ -820,6 +820,19 @@ <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> diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml index befb416fc7..093858bb0e 100644 --- a/docs/users_guide/glasgow_exts.xml +++ b/docs/users_guide/glasgow_exts.xml @@ -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> |