Note [Data constructor workers and wrappers]
* Algebraic data types - Always have a worker, with no unfolding - May or may not have a wrapper; see Note [The need for a wrapper] * Newtypes - Always have a worker, which has a compulsory unfolding (just a cast) - May or may not have a wrapper; see Note [The need for a wrapper] * INVARIANT: the dictionary constructor for a class never has a wrapper. * See Note [Data Constructor Naming] for how the worker and wrapper are named * The workers don't take the dcStupidTheta dicts as arguments, while the wrappers currently do * The wrapper (if it exists) takes dcOrigArgTys as its arguments. The worker takes dataConRepArgTys as its arguments If the wrapper is absent, dataConRepArgTys is the same as dcOrigArgTys * The 'NoDataConRep' case of DataConRep is important. Not only is it efficient, but it also ensures that the wrapper is replaced by the worker (because it *is* the worker) even when there are no args. E.g. in f (:) x the (:) *is* the worker. This is really important in rule matching, (We could match on the wrappers, but that makes it less likely that rules will match when we bring bits of unfoldings together.)
References 2
- Data Constructor Naming GHC.Core.DataCon
- The need for a wrapper GHC.Core.DataCon
Referenced by 1
- GHC.Core.DataCon call site