Changes between Version 7 and Version 8 of TypeFunctionsIface


Ignore:
Timestamp:
Oct 11, 2006 4:11:28 AM (8 years ago)
Author:
chak
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TypeFunctionsIface

    v7 v8  
    33== Representation of family instances == 
    44 
    5 The `IfaceSyn.IfaceData` variant of `IfaceDecl` contains a new `ifFamInst :: Maybe IfaceFamInst` field that is distinguishes ordinary data/newtype declarations from family instances.  In the latter case, a `IfaceFamInst` value gives the instances head of the family instance.  Moreover, all family instance heads of a module are collected in the new `mi_fam_insts :: [(IfaceFamInst, IfaceDecl)]` field of `HscTypes.ModIface`.  We don't include the `IfaceDecl` component into `IfaceFamInst`, as we otherwise would get a cyclic dependency - the `IfaceDecl` must include `IfaceFamInst`, so that we can generate the correct wrapper signature for family data constructors during type checking the interface declarations. 
     5The `IfaceSyn.IfaceData` variant of `IfaceDecl` contains a new `ifFamInst :: Maybe (IfaceTyCon, [IfaceType])` field that distinguishes ordinary data/newtype declarations from family instances.  In the latter case, the `(IfaceTyCon, [IfaceType])` value gives the family instance type.  In addition, each family instance is represented by a value of type `IfaceFamInst` that includes the instances rough match (i.e., name of the family type and a `[Maybe IfaceTyCon]` value that gives the outermost type constructor of each index argument for that instance) and refers to the type declaration for full details (as a class instance does with its dfun). 
    66 
    7 The `mi_fam_insts` field does not contain any additional information, but instead is just a cached summary of the family instances of the `mi_decls` field.  Hence, the serialised interface description does not explicitly contain the value of `mi_fam_insts`.  Instead, the `get` method of `Binary ModIface` (in `BinIface`) - like all other places producing a `HscTypes.ModIface` - uses `HscTypes.mkIfaceFamInstsCache` to extract the relevant information from the declarations. 
    8  
    9 Similarly, `HscTypes.ModDetails` maintains a cached summary of the type checked representations of family instances in `md_fam_insts :: ![FamInstEnv.FamInst]`.  This computed from the field `md_types` with `HscTypes.mkDetailsFamInstsCache`. 
     7Moreover, much like class instances, family instance heads of a module are collected in the new `mi_fam_insts :: [IfaceFamInst]` field of `HscTypes.ModIface`.  This allows to enter the rough matches into the `ModGuts`, when reading the interface, without having to parse the full tycon that represents the instance yet.  This in turn avoids pulling in everything that hangs of that tycon.