diff options
author | simonpj@microsoft.com <unknown> | 2008-06-06 12:24:59 +0000 |
---|---|---|
committer | simonpj@microsoft.com <unknown> | 2008-06-06 12:24:59 +0000 |
commit | f87698f5cd016f5a5643e60709cc16d12ae7d753 (patch) | |
tree | 0e0023fb1cceb95e9928881313d77baa83f6f8cf /docs | |
parent | 1c05d4fbb6ee7ab68470d0aa79d74a3a4f0d8383 (diff) | |
download | haskell-f87698f5cd016f5a5643e60709cc16d12ae7d753.tar.gz |
Improve documentation for standalone deriving
Diffstat (limited to 'docs')
-rw-r--r-- | docs/users_guide/glasgow_exts.xml | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml index 5a4c46584a..6b8a20b486 100644 --- a/docs/users_guide/glasgow_exts.xml +++ b/docs/users_guide/glasgow_exts.xml @@ -2533,9 +2533,27 @@ The syntax is identical to that of an ordinary instance declaration apart from ( You must supply a context (in the example the context is <literal>(Eq a)</literal>), exactly as you would in an ordinary instance declaration. (In contrast the context is inferred in a <literal>deriving</literal> clause -attached to a data type declaration.) These <literal>deriving instance</literal> -rules obey the same rules concerning form and termination as ordinary instance declarations, -controlled by the same flags; see <xref linkend="instance-decls"/>. </para> +attached to a data type declaration.) + +A <literal>deriving instance</literal> declaration +must obey the same rules concerning form and termination as ordinary instance declarations, +controlled by the same flags; see <xref linkend="instance-decls"/>. +</para> +<para> +Unlike a <literal>deriving</literal> +declaration attached to a <literal>data</literal> declaration, the instance can be more specific +than the data type (assuming you also use +<literal>-XFlexibleInstances</literal>, <xref linkend="instance-rules"/>). Consider +for example +<programlisting> + data Foo a = Bar a | Baz String + + deriving instance Eq a => Eq (Foo [a]) + deriving instance Eq a => Eq (Foo (Maybe a)) +</programlisting> +This will generate a derived instance for <literal>(Foo [a])</literal> and <literal>(Foo (Maybe a))</literal>, +but other types such as <literal>(Foo (Int,Bool))</literal> will not be an instance of <literal>Eq</literal>. +</para> <para>The stand-alone syntax is generalised for newtypes in exactly the same way that ordinary <literal>deriving</literal> clauses are generalised (<xref linkend="newtype-deriving"/>). |