Add support for evaluation of type-level natural numbers.
authorIavor S. Diatchki <iavor.diatchki@gmail.com>
Fri, 13 Sep 2013 06:19:21 +0000 (23:19 -0700)
committerIavor S. Diatchki <iavor.diatchki@gmail.com>
Fri, 13 Sep 2013 06:19:21 +0000 (23:19 -0700)
commit1f77a5341cbd6649a6bc2af868002728cd79b9d7
tree66daf8120722af710af7d99530d142993d9ddb44
parentad15c2b4bd37082ce989268b3d2f86a2cd34386a
Add support for evaluation of type-level natural numbers.

This patch implements some simple evaluation of type-level expressions
featuring natural numbers.  We can evaluate *concrete* expressions that
use the built-in type families (+), (*), (^), and (<=?), declared in
GHC.TypeLits.   We can also do some type inference involving these
functions.  For example, if we encounter a constraint such as `(2 + x) ~ 5`
we can infer that `x` must be 3.  Note, however, this is used only to
resolve unification variables (i.e., as a form of a constraint improvement)
and not to generate new facts.  This is similar to how functional
dependencies work in GHC.

The patch adds a new form of coercion, `AxiomRuleCo`, which makes use
of a new form of axiom called `CoAxiomRule`.  This is the form of evidence
generate when we solve a constraint, such as `(1 + 2) ~ 3`.

The patch also adds support for built-in type-families, by adding a new
form of TyCon rhs: `BuiltInSynFamTyCon`.  such built-in type-family
constructors contain a record with functions that are used by the
constraint solver to simplify and improve constraints involving the
built-in function (see `TcInteract`).  The record in defined in `FamInst`.

The type constructors and rules for evaluating the type-level functions
are in a new module called `TcTypeNats`.
29 files changed:
compiler/coreSyn/CoreLint.lhs
compiler/coreSyn/MkExternalCore.lhs
compiler/coreSyn/TrieMap.lhs
compiler/deSugar/DsBinds.lhs
compiler/ghc.cabal.in
compiler/ghc.mk
compiler/iface/IfaceSyn.lhs
compiler/iface/IfaceType.lhs
compiler/iface/MkIface.lhs
compiler/iface/TcIface.lhs
compiler/main/PprTyThing.hs
compiler/prelude/PrelInfo.lhs
compiler/prelude/PrelNames.lhs
compiler/prelude/TysWiredIn.lhs
compiler/typecheck/FamInst.lhs
compiler/typecheck/FamInst.lhs-boot [new file with mode: 0644]
compiler/typecheck/TcEvidence.lhs
compiler/typecheck/TcHsSyn.lhs
compiler/typecheck/TcInteract.lhs
compiler/typecheck/TcRnDriver.lhs
compiler/typecheck/TcSMonad.lhs
compiler/typecheck/TcTyClsDecls.lhs
compiler/typecheck/TcType.lhs
compiler/typecheck/TcTypeNats.hs [new file with mode: 0644]
compiler/typecheck/TcTypeNats.hs-boot [new file with mode: 0644]
compiler/types/CoAxiom.lhs
compiler/types/Coercion.lhs
compiler/types/OptCoercion.lhs
compiler/types/TyCon.lhs