Simplify the implementation of Implicit Parameters
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 13 Jun 2012 16:21:09 +0000 (17:21 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 13 Jun 2012 16:21:09 +0000 (17:21 +0100)
commit5a8ac0f823c151c062a3f1903574030423bb255c
tree60c7bbe1091ddba9c404f8024928fcea83480523
parent03f78f0686f048e75d671f2797c8684b71655c49
Simplify the implementation of Implicit Parameters

This patch re-implements implicit parameters via a class
with a functional dependency:

    class IP (n::Symbol) a | n -> a where
      ip :: a

This definition is in the library module GHC.IP. Notice
how it use a type-literal, so we can have constraints like
   IP "x" Int
Now all the functional dependency machinery works right to make
implicit parameters behave as they should.

Much special-case processing for implicit parameters can be removed
entirely. One particularly nice thing is not having a dedicated
"original-name cache" for implicit parameters (the nsNames field of
NameCache).  But many other cases disappear:

  * BasicTypes.IPName
  * IPTyCon constructor in Tycon.TyCon
  * CIPCan constructor  in TcRnTypes.Ct
  * IPPred constructor  in Types.PredTree

Implicit parameters remain special in a few ways:

 * Special syntax.  Eg the constraint (IP "x" Int) is parsed
   and printed as (?x::Int).  And we still have local bindings
   for implicit parameters, and occurrences thereof.

 * A implicit-parameter binding  (let ?x = True in e) amounts
   to a local instance declaration, which we have not had before.
   It just generates an implication contraint (easy), but when
   going under it we must purge any existing bindings for
   ?x in the inert set.  See Note [Shadowing of Implicit Parameters]
   in TcSimplify

 * TcMType.sizePred classifies implicit parameter constraints as size-0,
   as before the change

There are accompanying patches to libraries 'base' and 'haddock'

All the work was done by Iavor Diatchki
39 files changed:
compiler/basicTypes/BasicTypes.lhs
compiler/basicTypes/Unique.lhs
compiler/coreSyn/MkCore.lhs
compiler/deSugar/DsExpr.lhs
compiler/ghc.cabal.in
compiler/hsSyn/HsBinds.lhs
compiler/hsSyn/HsExpr.lhs
compiler/hsSyn/HsTypes.lhs
compiler/iface/BinIface.hs
compiler/iface/IfaceEnv.lhs
compiler/iface/IfaceType.lhs
compiler/iface/TcIface.lhs
compiler/main/DynFlags.hs
compiler/main/HscTypes.lhs
compiler/parser/Parser.y.pp
compiler/prelude/PrelNames.lhs
compiler/prelude/TysWiredIn.lhs
compiler/rename/RnBinds.lhs
compiler/rename/RnExpr.lhs
compiler/rename/RnTypes.lhs
compiler/typecheck/Inst.lhs
compiler/typecheck/TcBinds.lhs
compiler/typecheck/TcCanonical.lhs
compiler/typecheck/TcErrors.lhs
compiler/typecheck/TcExpr.lhs
compiler/typecheck/TcHsSyn.lhs
compiler/typecheck/TcHsType.lhs
compiler/typecheck/TcInteract.lhs
compiler/typecheck/TcMType.lhs
compiler/typecheck/TcRnTypes.lhs
compiler/typecheck/TcSMonad.lhs
compiler/typecheck/TcSimplify.lhs
compiler/typecheck/TcSplice.lhs
compiler/typecheck/TcType.lhs
compiler/types/IParam.lhs [deleted file]
compiler/types/IParam.lhs-boot [deleted file]
compiler/types/TyCon.lhs
compiler/types/Type.lhs
compiler/types/TypeRep.lhs