diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2014-04-07 15:45:35 +0100 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2014-04-07 15:45:48 +0100 |
commit | 54e655536ecf7eba755b334058d5c22dab251bea (patch) | |
tree | 5743670fd43a4d3a4a8931d902ee024e7ea06cee /docs | |
parent | ec3e949e29990c054850f621e14a9d77e3197aee (diff) | |
download | haskell-54e655536ecf7eba755b334058d5c22dab251bea.tar.gz |
Derive Typable for promoted data constructors (Trac #8950)
I got sucked into a significant refactoring of the way that
Typeable instances are derived. This makes it simpler and
more uniform.
I also improved the documentation in the user manual. Typeable
really is different to other classes, and now gets its own subsection.
Diffstat (limited to 'docs')
-rw-r--r-- | docs/users_guide/flags.xml | 2 | ||||
-rw-r--r-- | docs/users_guide/glasgow_exts.xml | 93 |
2 files changed, 62 insertions, 33 deletions
diff --git a/docs/users_guide/flags.xml b/docs/users_guide/flags.xml index 6acd28dc0a..0ad6fc2f6c 100644 --- a/docs/users_guide/flags.xml +++ b/docs/users_guide/flags.xml @@ -745,7 +745,7 @@ </row> <row> <entry><option>-XAutoDeriveTypeable</option></entry> - <entry>Automatically <link linkend="auto-derive-typeable">derive Typeable instances for every datatype and type class declaration</link>. + <entry>Automatically <link linkend="deriving-typeable">derive Typeable instances for every datatype and type class declaration</link>. Implies <option>-XDeriveDataTypeable</option>.</entry> <entry>dynamic</entry> <entry><option>-XNoAutoDeriveTypeable</option></entry> diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml index 33124122ef..44f0d98ab2 100644 --- a/docs/users_guide/glasgow_exts.xml +++ b/docs/users_guide/glasgow_exts.xml @@ -3842,9 +3842,8 @@ GHC always treats the <emphasis>last</emphasis> parameter of the instance </sect2> - -<sect2 id="deriving-typeable"> -<title>Deriving clause for extra classes (<literal>Typeable</literal>, <literal>Data</literal>, etc)</title> +<sect2 id="deriving-extra"> +<title>Deriving instances of extra classes (<literal>Data</literal>, etc)</title> <para> Haskell 98 allows the programmer to add "<literal>deriving( Eq, Ord )</literal>" to a data type @@ -3856,27 +3855,6 @@ classes <literal>Eq</literal>, <literal>Ord</literal>, <para> GHC extends this list with several more classes that may be automatically derived: <itemizedlist> -<listitem><para> With <option>-XDeriveDataTypeable</option>, you can derive instances of the classes -<literal>Typeable</literal>, and <literal>Data</literal>, defined in the library -modules <literal>Data.Typeable</literal> and <literal>Data.Data</literal> respectively. -</para> -<para>Since GHC 7.8.1, <literal>Typeable</literal> is kind-polymorphic (see -<xref linkend="kind-polymorphism"/>) and can be derived for any datatype and -type class. Instances for datatypes can be derived by attaching a -<literal>deriving Typeable</literal> clause to the datatype declaration, or by -using standalone deriving (see <xref linkend="stand-alone-deriving"/>). -Instances for type classes can only be derived using standalone deriving. -For data families, <literal>Typeable</literal> should only be derived for the -uninstantiated family type; each instance will then automatically have a -<literal>Typeable</literal> instance too. -See also <xref linkend="auto-derive-typeable"/>. -</para> -<para> -Also since GHC 7.8.1, handwritten (ie. not derived) instances of -<literal>Typeable</literal> are forbidden, and will result in an error. -</para> -</listitem> - <listitem><para> With <option>-XDeriveGeneric</option>, you can derive instances of the classes <literal>Generic</literal> and <literal>Generic1</literal>, defined in <literal>GHC.Generics</literal>. @@ -3889,6 +3867,12 @@ the class <literal>Functor</literal>, defined in <literal>GHC.Base</literal>. </para></listitem> +<listitem><para> With <option>-XDeriveDataTypeable</option>, you can derive instances of +the class <literal>Data</literal>, +defined in <literal>Data.Data</literal>. See <xref linkend="deriving-typeable"/> for +deriving <literal>Typeable</literal>. +</para></listitem> + <listitem><para> With <option>-XDeriveFoldable</option>, you can derive instances of the class <literal>Foldable</literal>, defined in <literal>Data.Foldable</literal>. @@ -3899,21 +3883,66 @@ the class <literal>Traversable</literal>, defined in <literal>Data.Traversable</literal>. </para></listitem> </itemizedlist> +You can also use a standalone deriving declaration instead +(see <xref linkend="stand-alone-deriving"/>). +</para> +<para> In each case the appropriate class must be in scope before it can be mentioned in the <literal>deriving</literal> clause. </para> </sect2> -<sect2 id="auto-derive-typeable"> -<title>Automatically deriving <literal>Typeable</literal> instances</title> +<sect2 id="deriving-typeable"> +<title>Deriving <literal>Typeable</literal> instances</title> -<para> +<para>The class <literal>Typeable</literal> is very special: +<itemizedlist> +<listitem><para> +<literal>Typeable</literal> is kind-polymorphic (see +<xref linkend="kind-polymorphism"/>). +</para></listitem> + +<listitem><para> +Only derived instances of <literal>Typeable</literal> are allowed; +i.e. handwritten instances are forbidden. This ensures that the +programmer cannot subert the type system by writing bogus instances. +</para></listitem> + +<listitem><para> +With <option>-XDeriveDataTypeable</option> +GHC allows you to derive instances of <literal>Typeable</literal> for data types or newtypes, +using a <literal>deriving</literal> clause, or using +a standalone deriving declaration (<xref linkend="stand-alone-deriving"/>). +</para></listitem> + +<listitem><para> +With <option>-XDataKinds</option>, deriving <literal>Typeable</literal> for a data +type (whether via a deriving clause or standalone deriving) +also derives <literal>Typeable</literal> for the promoted data constructors (<xref linkend="promotion"/>). +</para></listitem> + +<listitem><para> +However, using standalone deriving, you can <emphasis>also</emphasis> derive +a <literal>Typeable</literal> instance for a data family. +You may not add a <literal>deriving(Typeable)</literal> clause to a +<literal>data instance</literal> declaration; instead you must use a +standalone deriving declaration for the data family. +</para></listitem> + +<listitem><para> +Using standalone deriving, you can <emphasis>also</emphasis> derive +a <literal>Typeable</literal> instance for a type class. +</para></listitem> + +<listitem><para> The flag <option>-XAutoDeriveTypeable</option> triggers the generation -of derived <literal>Typeable</literal> instances for every datatype and type -class declaration in the module it is used. It will also generate -<literal>Typeable</literal> instances for any promoted data constructors -(<xref linkend="promotion"/>). This flag implies -<option>-XDeriveDataTypeable</option> (<xref linkend="deriving-typeable"/>). +of derived <literal>Typeable</literal> instances for every datatype, data family, +and type class declaration in the module it is used, unless a manually-specified one is +already provided. +This flag implies <option>-XDeriveDataTypeable</option>. +</para></listitem> +</itemizedlist> + </para> </sect2> |