diff options
author | Iavor S. Diatchki <iavor.diatchki@gmail.com> | 2013-09-12 23:19:21 -0700 |
---|---|---|
committer | Iavor S. Diatchki <iavor.diatchki@gmail.com> | 2013-09-12 23:19:21 -0700 |
commit | 1f77a5341cbd6649a6bc2af868002728cd79b9d7 (patch) | |
tree | 66daf8120722af710af7d99530d142993d9ddb44 /compiler/prelude | |
parent | ad15c2b4bd37082ce989268b3d2f86a2cd34386a (diff) | |
download | haskell-1f77a5341cbd6649a6bc2af868002728cd79b9d7.tar.gz |
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`.
Diffstat (limited to 'compiler/prelude')
-rw-r--r-- | compiler/prelude/PrelInfo.lhs | 4 | ||||
-rw-r--r-- | compiler/prelude/PrelNames.lhs | 18 | ||||
-rw-r--r-- | compiler/prelude/TysWiredIn.lhs | 15 |
3 files changed, 23 insertions, 14 deletions
diff --git a/compiler/prelude/PrelInfo.lhs b/compiler/prelude/PrelInfo.lhs index bb3e54ada2..4a39977797 100644 --- a/compiler/prelude/PrelInfo.lhs +++ b/compiler/prelude/PrelInfo.lhs @@ -42,6 +42,7 @@ import HscTypes import Class import TyCon import Util +import {-# SOURCE #-} TcTypeNats ( typeNatTyCons ) import Data.Array \end{code} @@ -89,7 +90,8 @@ wiredInThings , map (AnId . primOpId) allThePrimOps ] where - tycon_things = map ATyCon ([funTyCon] ++ primTyCons ++ wiredInTyCons) + tycon_things = map ATyCon ([funTyCon] ++ primTyCons ++ wiredInTyCons + ++ typeNatTyCons) \end{code} We let a lot of "non-standard" values be visible, so that we can make diff --git a/compiler/prelude/PrelNames.lhs b/compiler/prelude/PrelNames.lhs index b428f6e375..acac400c04 100644 --- a/compiler/prelude/PrelNames.lhs +++ b/compiler/prelude/PrelNames.lhs @@ -295,10 +295,6 @@ basicKnownKeyNames -- Type-level naturals singIClassName, - typeNatLeqClassName, - typeNatAddTyFamName, - typeNatMulTyFamName, - typeNatExpTyFamName, -- Implicit parameters ipClassName, @@ -1144,13 +1140,8 @@ randomGenClassName = clsQual rANDOM (fsLit "RandomGen") randomGenClassKey isStringClassName = clsQual dATA_STRING (fsLit "IsString") isStringClassKey -- Type-level naturals -singIClassName, typeNatLeqClassName, - typeNatAddTyFamName, typeNatMulTyFamName, typeNatExpTyFamName :: Name +singIClassName :: Name singIClassName = clsQual gHC_TYPELITS (fsLit "SingI") singIClassNameKey -typeNatLeqClassName = clsQual gHC_TYPELITS (fsLit "<=") typeNatLeqClassNameKey -typeNatAddTyFamName = tcQual gHC_TYPELITS (fsLit "+") typeNatAddTyFamNameKey -typeNatMulTyFamName = tcQual gHC_TYPELITS (fsLit "*") typeNatMulTyFamNameKey -typeNatExpTyFamName = tcQual gHC_TYPELITS (fsLit "^") typeNatExpTyFamNameKey -- Implicit parameters ipClassName :: Name @@ -1273,9 +1264,8 @@ constructorClassKey = mkPreludeClassUnique 40 selectorClassKey = mkPreludeClassUnique 41 -- SingI: see Note [SingI and EvLit] in TcEvidence -singIClassNameKey, typeNatLeqClassNameKey :: Unique +singIClassNameKey :: Unique singIClassNameKey = mkPreludeClassUnique 42 -typeNatLeqClassNameKey = mkPreludeClassUnique 43 ghciIoClassKey :: Unique ghciIoClassKey = mkPreludeClassUnique 44 @@ -1477,13 +1467,15 @@ rep1TyConKey = mkPreludeTyConUnique 156 -- Type-level naturals typeNatKindConNameKey, typeSymbolKindConNameKey, - typeNatAddTyFamNameKey, typeNatMulTyFamNameKey, typeNatExpTyFamNameKey + typeNatAddTyFamNameKey, typeNatMulTyFamNameKey, typeNatExpTyFamNameKey, + typeNatLeqTyFamNameKey :: Unique typeNatKindConNameKey = mkPreludeTyConUnique 160 typeSymbolKindConNameKey = mkPreludeTyConUnique 161 typeNatAddTyFamNameKey = mkPreludeTyConUnique 162 typeNatMulTyFamNameKey = mkPreludeTyConUnique 163 typeNatExpTyFamNameKey = mkPreludeTyConUnique 164 +typeNatLeqTyFamNameKey = mkPreludeTyConUnique 165 -- SIMD vector types (Unique keys) floatX4PrimTyConKey, doubleX2PrimTyConKey, int32X4PrimTyConKey, diff --git a/compiler/prelude/TysWiredIn.lhs b/compiler/prelude/TysWiredIn.lhs index b563b25cc4..d8c880f1c3 100644 --- a/compiler/prelude/TysWiredIn.lhs +++ b/compiler/prelude/TysWiredIn.lhs @@ -14,6 +14,7 @@ module TysWiredIn ( boolTy, boolTyCon, boolTyCon_RDR, boolTyConName, trueDataCon, trueDataConId, true_RDR, falseDataCon, falseDataConId, false_RDR, + promotedBoolTyCon, promotedFalseDataCon, promotedTrueDataCon, -- * Ordering ltDataCon, ltDataConId, @@ -68,6 +69,8 @@ module TysWiredIn ( -- * Equality predicates eqTyCon_RDR, eqTyCon, eqTyConName, eqBoxDataCon, + mkWiredInTyConName -- This is used in TcTypeNats to define the + -- built-in functions for evaluation. ) where #include "HsVersions.h" @@ -782,3 +785,15 @@ mkPArrFakeCon arity = data_con isPArrFakeCon :: DataCon -> Bool isPArrFakeCon dcon = dcon == parrFakeCon (dataConSourceArity dcon) \end{code} + +Promoted Booleans + +\begin{code} +promotedBoolTyCon, promotedFalseDataCon, promotedTrueDataCon :: TyCon +promotedBoolTyCon = promoteTyCon boolTyCon +promotedTrueDataCon = promoteDataCon trueDataCon +promotedFalseDataCon = promoteDataCon falseDataCon +\end{code} + + + |