Commit e17a8008 authored by simonpj@microsoft.com's avatar simonpj@microsoft.com

Add flag -XExplicitForAll and document it

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 
parent 99332983
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -819,6 +819,19 @@
<entry>dynamic</entry>
<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>
......
......@@ -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>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment