Added -ftype-families to the user's manual
[ghc-hetmet.git] / docs / users_guide / glasgow_exts.xml
index dfedb08..ac10e21 100644 (file)
@@ -277,8 +277,6 @@ documentation</ulink> describes all the libraries that come with GHC.
   </sect1>
 
 <!-- UNBOXED TYPES AND PRIMITIVE OPERATIONS -->
-<!--    included from primitives.sgml  -->
-<!-- &primitives; -->
 <sect1 id="primitives">
   <title>Unboxed types and primitive operations</title>
 
@@ -383,6 +381,13 @@ worse, the unboxed value might be larger than a pointer
 (<literal>Double&num;</literal> for instance).
 </para>
 </listitem>
+<listitem><para> You cannot define a newtype whose representation type
+(the argument type of the data constructor) is an unboxed type.  Thus,
+this is illegal:
+<programlisting>
+  newtype A = MkA Int#
+</programlisting>
+</para></listitem>
 <listitem><para> You cannot bind a variable with an unboxed type
 in a <emphasis>top-level</emphasis> binding.
 </para></listitem>
@@ -552,14 +557,11 @@ import qualified Control.Monad.ST.Strict as ST
       linkend="search-path"/>.</para>
 
       <para>GHC comes with a large collection of libraries arranged
-      hierarchically; see the accompanying library documentation.
-      There is an ongoing project to create and maintain a stable set
-      of <quote>core</quote> libraries used by several Haskell
-      compilers, and the libraries that GHC comes with represent the
-      current status of that project.  For more details, see <ulink
-      url="http://www.haskell.org/~simonmar/libraries/libraries.html">Haskell
-      Libraries</ulink>.</para>
-
+      hierarchically; see the accompanying <ulink
+      url="../libraries/index.html">library
+      documentation</ulink>.  More libraries to install are available
+      from <ulink
+      url="http://hackage.haskell.org/packages/hackage.html">HackageDB</ulink>.</para>
     </sect2>
 
     <!-- ====================== PATTERN GUARDS =======================  -->
@@ -1330,7 +1332,7 @@ data Counter a = forall self. NewCounter
 Here <literal>tag</literal> is a public field, with a well-typed selector
 function <literal>tag :: Counter a -> a</literal>.  The <literal>self</literal>
 type is hidden from the outside; any attempt to apply <literal>_this</literal>,
-<literal>_inc</literal> or <literal>_output</literal> as functions will raise a
+<literal>_inc</literal> or <literal>_display</literal> as functions will raise a
 compile-time error.  In other words, <emphasis>GHC defines a record selector function
 only for fields whose type does not mention the existentially-quantified variables</emphasis>.
 (This example used an underscore in the fields for which record selectors
@@ -2546,7 +2548,7 @@ the context and head of the instance declaration can each consist of arbitrary
 following rules:
 <orderedlist>
 <listitem><para>
-For each assertion in the context:
+The Paterson Conditions: for each assertion in the context
 <orderedlist>
 <listitem><para>No type variable has more occurrences in the assertion than in the head</para></listitem>
 <listitem><para>The assertion has fewer constructors and variables (taken together
@@ -2554,7 +2556,7 @@ For each assertion in the context:
 </orderedlist>
 </para></listitem>
 
-<listitem><para>The coverage condition.  For each functional dependency,
+<listitem><para>The Coverage Condition.  For each functional dependency,
 <replaceable>tvs</replaceable><subscript>left</subscript> <literal>-&gt;</literal>
 <replaceable>tvs</replaceable><subscript>right</subscript>,  of the class,
 every type variable in
@@ -2566,11 +2568,15 @@ corresponding type in the instance declaration.
 </orderedlist>
 These restrictions ensure that context reduction terminates: each reduction
 step makes the problem smaller by at least one
-constructor.  For example, the following would make the type checker
-loop if it wasn't excluded:
-<programlisting>
-  instance C a => C a where ...
-</programlisting>
+constructor.  Both the Paterson Conditions and the Coverage Condition are lifted 
+if you give the <option>-fallow-undecidable-instances</option> 
+flag (<xref linkend="undecidable-instances"/>).
+You can find lots of background material about the reason for these
+restrictions in the paper <ulink
+url="http://research.microsoft.com/%7Esimonpj/papers/fd%2Dchr/">
+Understanding functional dependencies via Constraint Handling Rules</ulink>.
+</para>
+<para>
 For example, these are OK:
 <programlisting>
   instance C Int [a]          -- Multiple parameters
@@ -2622,11 +2628,6 @@ something more specific does not:
     op = ... -- Default
 </programlisting>
 </para>
-<para>You can find lots of background material about the reason for these
-restrictions in the paper <ulink
-url="http://research.microsoft.com/%7Esimonpj/papers/fd%2Dchr/">
-Understanding functional dependencies via Constraint Handling Rules</ulink>.
-</para>
 </sect3>
 
 <sect3 id="undecidable-instances">
@@ -2691,8 +2692,8 @@ makes instance inference go into a loop, because it requires the constraint
 Nevertheless, GHC allows you to experiment with more liberal rules.  If you use
 the experimental flag <option>-fallow-undecidable-instances</option>
 <indexterm><primary>-fallow-undecidable-instances
-option</primary></indexterm>, you can use arbitrary
-types in both an instance context and instance head.  Termination is ensured by having a
+option</primary></indexterm>, both the Paterson Conditions and the Coverage Condition
+(described in <xref linkend="instance-rules"/>) are lifted.  Termination is ensured by having a
 fixed-depth recursion stack.  If you exceed the stack depth you get a
 sort of backtrace, and the opportunity to increase the stack depth
 with <option>-fcontext-stack=</option><emphasis>N</emphasis>.
@@ -4086,15 +4087,39 @@ The class <literal>IsString</literal> is defined as:
 class IsString a where
     fromString :: String -> a
 </programlisting>
-And the only predefined instance is the obvious one to make strings work as usual:
+The only predefined instance is the obvious one to make strings work as usual:
 <programlisting>
 instance IsString [Char] where
     fromString cs = cs
 </programlisting>
+The class <literal>IsString</literal> is not in scope by default.  If you want to mention
+it explicitly (for exmaple, to give an instance declaration for it), you can import it
+from module <literal>GHC.Exts</literal>.
+</para>
+<para>
+Haskell's defaulting mechanism is extended to cover string literals, when <option>-foverloaded-strings</option> is specified.
+Specifically:
+<itemizedlist>
+<listitem><para>
+Each type in a default declaration must be an 
+instance of <literal>Num</literal> <emphasis>or</emphasis> of <literal>IsString</literal>.
+</para></listitem>
+
+<listitem><para>
+The standard defaulting rule (<ulink url="http://haskell.org/onlinereport/decls.html#sect4.3.4">Haskell Report, Section 4.3.4</ulink>)
+is extended thus: defaulting applies when all the unresolved constraints involve standard classes
+<emphasis>or</emphasis> <literal>IsString</literal>; and at least one is a numeric class
+<emphasis>or</emphasis> <literal>IsString</literal>.
+</para></listitem>
+</itemizedlist>
 </para>
 <para>
 A small example:
 <programlisting>
+module Main where
+
+import GHC.Exts( IsString(..) )
+
 newtype MyString = MyString String deriving (Eq, Show)
 instance IsString MyString where
     fromString = MyString
@@ -4114,6 +4139,33 @@ to work since it gets translated into an equality comparison.
 </para>
 </sect2>
 
+<sect2 id="type-families">
+<title>Type families
+</title>
+
+<para>
+GHC supports the definition of type families indexed by types.  They may be
+seen as an extension of Haskell 98's class-based overloading of values to
+types.  When type families are declared in classes, they are also known as
+associated types.
+</para>
+<para>
+There are two forms of type families: data families and type synonym families.
+Currently, only the former are fully implemented, while we are still working
+on the latter.  As a result, the specification of the language extension is
+also still to some degree in flux.  Hence, a more detailed description of
+the language extension and its use is currently available
+from <ulink url="http://haskell.org/haskellwiki/GHC/Indexed_types">the Haskell
+wiki page on type families</ulink>.  The material will be moved to this user's
+guide when it has stabilised.
+</para>
+<para>
+Type families are enabled by the flag <option>-ftype-families</option>.
+</para>
+
+
+</sect2>
+
 </sect1>
 <!-- ==================== End of type system extensions =================  -->