Comments about datacon worker and wrappers
authorManuel M T Chakravarty <chak@cse.unsw.edu.au>
Wed, 20 Sep 2006 18:20:26 +0000 (18:20 +0000)
committerManuel M T Chakravarty <chak@cse.unsw.edu.au>
Wed, 20 Sep 2006 18:20:26 +0000 (18:20 +0000)
Mon Sep 18 17:21:20 EDT 2006  Manuel M T Chakravarty <chak@cse.unsw.edu.au>
  * Comments about datacon worker and wrappers
  Sun Aug  6 20:57:48 EDT 2006  Manuel M T Chakravarty <chak@cse.unsw.edu.au>
    * Comments about datacon worker and wrappers
    Fri Aug  4 04:23:28 EDT 2006  simonpj@microsoft.com

compiler/basicTypes/DataCon.lhs

index af19a58..0b0dead 100644 (file)
@@ -104,21 +104,55 @@ data constructor.  The type checker translates it into either the wrapper Id
 
 The data con has one or two Ids associated with it:
 
-  The "worker Id", is the actual data constructor.
-       Its type may be different to the Haskell source constructor
-       because:
-               - useless dict args are dropped
-               - strict args may be flattened
-       The worker is very like a primop, in that it has no binding.
+The "worker Id", is the actual data constructor.
+* Every data constructor (newtype or data type) has a worker
 
+* The worker is very like a primop, in that it has no binding.
 
+* For a *data* type, the worker *is* the data constructor;
+  it has no unfolding
 
-  The "wrapper Id", $WC, whose type is exactly what it looks like
-       in the source program. It is an ordinary function,
-       and it gets a top-level binding like any other function.
+* For a *newtype*, the worker has a compulsory unfolding which 
+  does a cast, e.g.
+       newtype T = MkT Int
+       The worker for MkT has unfolding
+               \(x:Int). x `cast` sym CoT
+  Here CoT is the type constructor, witnessing the FC axiom
+       axiom CoT : T = Int
 
-       The wrapper Id isn't generated for a data type if the worker
-       and wrapper are identical. 
+The "wrapper Id", $WC, goes as follows
+
+* Its type is exactly what it looks like in the source program. 
+
+* It is an ordinary function, and it gets a top-level binding 
+  like any other function.
+
+* The wrapper Id isn't generated for a data type if there is
+  nothing for the wrapper to do.  That is, if its defn would be
+       $wC = C
+
+Why might the wrapper have anything to do?  Two reasons:
+
+* Unboxing strict fields (with -funbox-strict-fields)
+       data T = MkT !(Int,Int)
+       $wMkT :: (Int,Int) -> T
+       $wMkT (x,y) = MkT x y
+  Notice that the worker has two fields where the wapper has 
+  just one.  That is, the worker has type
+               MkT :: Int -> Int -> T
+
+* Equality constraints for GADTs
+       data T a where { MkT :: a -> T [a] }
+
+  The worker gets a type with explicit equality
+  constraints, thus:
+       MkT :: forall a b. (a=[b]) => b -> T a
+
+  The wrapper has the programmer-specified type:
+       $wMkT :: a -> T [a]
+       $wMkT a x = MkT [a] a [a] x
+  The third argument is a coerion
+       [a] :: [a]:=:[a]