Reorganisation of the source tree
[ghc-hetmet.git] / ghc / docs / comm / the-beast / types.html
diff --git a/ghc/docs/comm/the-beast/types.html b/ghc/docs/comm/the-beast/types.html
deleted file mode 100644 (file)
index 383b71f..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
-<html>
-  <head>
-    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
-    <title>The GHC Commentary - Hybrid Types</title>
-  </head>
-
-  <body BGCOLOR="FFFFFF">
-    <h1>The GHC Commentary - Hybrid Types</h1>
-    <p>
-      GHC essentially supports two type systems: (1) the <em>source type
-       system</em> (which is a heavily extended version of the type system of
-      Haskell 98) and (2) the <em>Core type system,</em> which is the type system
-      used by the intermediate language (see also <a
-      href="desugar.html">Sugar Free: From Haskell To Core</a>).
-    </p>
-    <p>
-      During parsing and renaming, type information is represented in a form
-      that is very close to Haskell's concrete syntax; it is defined by
-      <code>HsTypes.HsType</code>.  In addition, type, class, and instance
-      declarations are maintained in their source form as defined in the
-      module <code>HsDecl</code>.  The situation changes during type checking,
-      where types are translated into a second representation, which is
-      defined in the module <code>types/TypeRep.lhs</code>, as type
-      <code>Type</code>.  This second representation is peculiar in that it is
-      a hybrid between the source representation of types and the Core
-      representation of types.  Using functions, such as
-      <code>Type.coreView</code> and <code>Type.deepCoreView</code>, a value
-      of type <code>Type</code> exhibits its Core representation.  On the
-      other hand, pretty printing a <code>Type</code> with
-      <code>TypeRep.pprType</code> yields the type's source representation.
-    </p>
-    <p>
-      In fact, the <a href="typecheck.html">type checker</a> maintains type
-      environments based on <code>Type</code>, but needs to perform type
-      checking on source-level types.  As a result, we have functions
-      <code>Type.tcEqType</code> and <code>Type.tcCmpType</code>, which
-      compare types based on their source representation, as well as the
-      function <code>coreEqType</code>, which compares them based on their
-      core representation.  The latter is needed during type checking of Core
-      (as performed by the functions in the module
-      <code>coreSyn/CoreLint.lhs</code>). 
-    </p>
-
-    <h2>Type Synonyms</h2>
-    <p>
-      Type synonyms in Haskell are essentially a form of macro definitions on
-      the type level.  For example, when the type checker compares two type
-      terms, synonyms are always compared in their expanded form.  However, to
-      produce good error messages, we like to avoid expanding type synonyms
-      during pretty printing.  Hence, <code>Type</code> has a variant
-      <code>NoteTy TyNote Type</code>, where
-    </p>
-    <blockquote>
-      <pre>
-data TyNote
-  = FTVNote TyVarSet   -- The free type variables of the noted expression
-
-  | SynNote Type       -- Used for type synonyms
-                       -- The Type is always a TyConApp, and is the un-expanded form.
-                       -- The type to which the note is attached is the expanded form.</pre>
-    </blockquote>
-    <p>
-      In other words, a <code>NoteTy</code> represents the expanded form of a
-      type synonym together with a note stating its source form.
-    </p>
-
-    <h3>Creating Representation Types of Synonyms</h3>
-    <p>
-      During translation from <code>HsType</code> to <code>Type</code> the
-      function <code>Type.mkSynTy</code> is used to construct representations
-      of applications of type synonyms.  It creates a <code>NoteTy</code> node
-      if the synonym is applied to a sufficient number of arguments;
-      otherwise, it builds a simple <code>TyConApp</code> and leaves it to
-      <code>TcMType.checkValidType</code> to pick up invalid unsaturated
-      synonym applications.  While creating a <code>NoteTy</code>,
-      <code>mkSynTy</code> also expands the synonym by substituting the type
-      arguments for the parameters of the synonym definition, using
-      <code>Type.substTyWith</code>.
-    </p>
-    <p>
-      The function <code>mkSynTy</code> is used indirectly via
-      <code>mkGenTyConApp</code>, <code>mkAppTy</code>, and
-      <code>mkAppTy</code>, which construct type representations involving
-      type applications.  The function <code>mkSynTy</code> is also used
-      directly during type checking interface files; this is for tedious
-      reasons to do with forall hoisting - see the comment at
-      <code>TcIface.mkIfTcApp</code>. 
-    </p>
-
-    <h2>Newtypes</h2>
-    <p>
-      Data types declared by a <code>newtype</code> declarations constitute new
-      type constructors---i.e., they are not just type macros, but introduce
-      new type names.  However, provided that a newtype is not recursive, we
-      still want to implement it by its representation type.  GHC realises this
-      by providing two flavours of type equality: (1) <code>tcEqType</code> is
-      source-level type equality, which compares newtypes and
-      <code>PredType</code>s by name, and (2) <code>coreEqType</code> compares
-      them structurally (by using <code>deepCoreView</code> to expand the
-      representation before comparing).  The function
-      <code>deepCoreView</code> (via <code>coreView</code>) invokes
-      <code>expandNewTcApp</code> for every type constructor application
-      (<code>TyConApp</code>) to determine whether we are looking at a newtype
-      application that needs to be expanded to its representation type.
-    </p>
-
-    <h2>Predicates</h2>
-    <p>
-      The dictionary translation of type classes, translates each predicate in
-      a type context of a type signature into an additional argument, which
-      carries a dictionary with the functions overloaded by the corresponding
-      class.  The <code>Type</code> data type has a special variant
-      <code>PredTy PredType</code> for predicates, where
-    </p>
-    <blockquote>
-      <pre>
-data PredType 
-  = ClassP Class [Type]                -- Class predicate
-  | IParam (IPName Name) Type  -- Implicit parameter</pre>
-    </blockquote>
-    <p>
-      These types need to be handled as source type during type checking, but
-      turn into their representations when inspected through
-      <code>coreView</code>.  The representation is determined by
-      <code>Type.predTypeRep</code>.
-    </p>
-
-    <h2>Representation of Type Constructors</h2>
-    <p>
-      Type constructor applications are represented in <code>Type</code> by
-      the variant <code>TyConApp :: TyCon -> [Type] -> Type</code>.  The first
-      argument to <code>TyConApp</code>, namely <code>TyCon.TyCon</code>,
-      distinguishes between function type constructors (variant
-      <code>FunTyCon</code>) and algebraic type constructors (variant
-      <code>AlgTyCon</code>), which arise from data and newtype declarations.
-      The variant <code>AlgTyCon</code> contains all the information available
-      from the data/newtype declaration as well as derived information, such
-      as the <code>Unique</code> and argument variance information.  This
-      includes a field <code>algTcRhs :: AlgTyConRhs</code>, where
-      <code>AlgTyConRhs</code> distinguishes three kinds of algebraic data
-      type declarations: (1) declarations that have been exported abstractly,
-      (2) <code>data</code> declarations, and (3) <code>newtype</code>
-      declarations.  The last two both include their original right hand side;
-      in addition, the third variant also caches the "ultimate" representation
-      type, which is the right hand side after expanding all type synonyms and
-      non-recursive newtypes.
-    </p>
-    <p>
-      Both data and newtype declarations refer to their data constructors
-      represented as <code>DataCon.DataCon</code>, which include all details
-      of their signature (as derived from the original declaration) as well
-      information for code generation, such as their tag value.
-    </p>
-
-    <h2>Representation of Classes and Instances</h2>
-    <p>
-      Class declarations turn into values of type <code>Class.Class</code>.
-      They represent methods as the <code>Id</code>s of the dictionary
-      selector functions.  Similar selector functions are available for
-      superclass dictionaries.
-    </p>
-    <p>
-      Instance declarations turn into values of type
-      <code>InstEnv.Instance</code>, which in interface files are represented
-      as <code>IfaceSyn.IfaceInst</code>.  Moreover, the type
-      <code>InstEnv.InstEnv</code>, which is a synonym for <code>UniqFM
-      ClsInstEnv</code>, provides a mapping of classes to their
-      instances---<code>ClsInstEnv</code> is essentially a list of instance
-      declarations.
-    </p>
-
-    <p><small>
-<!-- hhmts start -->
-Last modified: Sun Jun 19 13:07:22 EST 2005
-<!-- hhmts end -->
-    </small></p>
-  </body>
-</html>