diff options
author | Richard Eisenberg <eir@cis.upenn.edu> | 2015-12-24 14:33:19 -0500 |
---|---|---|
committer | Richard Eisenberg <eir@cis.upenn.edu> | 2015-12-24 14:37:39 -0500 |
commit | 2db18b8135335da2da9918b722699df684097be9 (patch) | |
tree | 660dd90916aa6568694bbe39cdab83c7af98c5d7 /compiler/prelude | |
parent | 48db13d279d592ed3044cbaf3513854bcb0d3dce (diff) | |
download | haskell-2db18b8135335da2da9918b722699df684097be9.tar.gz |
Visible type application
This re-working of the typechecker algorithm is based on
the paper "Visible type application", by Richard Eisenberg,
Stephanie Weirich, and Hamidhasan Ahmed, to be published at
ESOP'16.
This patch introduces -XTypeApplications, which allows users
to say, for example `id @Int`, which has type `Int -> Int`. See
the changes to the user manual for details.
This patch addresses tickets #10619, #5296, #10589.
Diffstat (limited to 'compiler/prelude')
-rw-r--r-- | compiler/prelude/PrimOp.hs | 2 | ||||
-rw-r--r-- | compiler/prelude/TysPrim.hs | 16 | ||||
-rw-r--r-- | compiler/prelude/TysWiredIn.hs | 6 |
3 files changed, 12 insertions, 12 deletions
diff --git a/compiler/prelude/PrimOp.hs b/compiler/prelude/PrimOp.hs index 67a44cc462..66172acd24 100644 --- a/compiler/prelude/PrimOp.hs +++ b/compiler/prelude/PrimOp.hs @@ -536,7 +536,7 @@ primOpType op Compare _occ ty -> compare_fun_ty ty GenPrimOp _occ tyvars arg_tys res_ty -> - mkInvForAllTys tyvars (mkFunTys arg_tys res_ty) + mkSpecForAllTys tyvars (mkFunTys arg_tys res_ty) primOpOcc :: PrimOp -> OccName primOpOcc op = case primOpInfo op of diff --git a/compiler/prelude/TysPrim.hs b/compiler/prelude/TysPrim.hs index a4715df0a6..14505850fd 100644 --- a/compiler/prelude/TysPrim.hs +++ b/compiler/prelude/TysPrim.hs @@ -648,7 +648,7 @@ mkProxyPrimTy k ty = TyConApp proxyPrimTyCon [k, ty] proxyPrimTyCon :: TyCon proxyPrimTyCon = mkPrimTyCon proxyPrimTyConName kind [Nominal,Nominal] VoidRep - where kind = ForAllTy (Named kv Invisible) $ + where kind = ForAllTy (Named kv Specified) $ mkFunTy k unliftedTypeKind kv = kKiVar k = mkTyVarTy kv @@ -664,8 +664,8 @@ proxyPrimTyCon = mkPrimTyCon proxyPrimTyConName kind [Nominal,Nominal] VoidRep eqPrimTyCon :: TyCon -- The representation type for equality predicates -- See Note [The equality types story] eqPrimTyCon = mkPrimTyCon eqPrimTyConName kind roles VoidRep - where kind = ForAllTy (Named kv1 Invisible) $ - ForAllTy (Named kv2 Invisible) $ + where kind = ForAllTy (Named kv1 Specified) $ + ForAllTy (Named kv2 Specified) $ mkFunTys [k1, k2] unliftedTypeKind [kv1, kv2] = mkTemplateTyVars [liftedTypeKind, liftedTypeKind] k1 = mkTyVarTy kv1 @@ -678,8 +678,8 @@ eqPrimTyCon = mkPrimTyCon eqPrimTyConName kind roles VoidRep eqReprPrimTyCon :: TyCon -- See Note [The equality types story] eqReprPrimTyCon = mkPrimTyCon eqReprPrimTyConName kind roles VoidRep - where kind = ForAllTy (Named kv1 Invisible) $ - ForAllTy (Named kv2 Invisible) $ + where kind = ForAllTy (Named kv1 Specified) $ + ForAllTy (Named kv2 Specified) $ mkFunTys [k1, k2] unliftedTypeKind [kv1, kv2] = mkTemplateTyVars [liftedTypeKind, liftedTypeKind] k1 = mkTyVarTy kv1 @@ -693,8 +693,8 @@ eqPhantPrimTyCon :: TyCon eqPhantPrimTyCon = mkPrimTyCon eqPhantPrimTyConName kind [Nominal, Nominal, Phantom, Phantom] VoidRep - where kind = ForAllTy (Named kv1 Invisible) $ - ForAllTy (Named kv2 Invisible) $ + where kind = ForAllTy (Named kv1 Specified) $ + ForAllTy (Named kv2 Specified) $ mkFunTys [k1, k2] unliftedTypeKind [kv1, kv2] = mkTemplateTyVars [liftedTypeKind, liftedTypeKind] k1 = mkTyVarTy kv1 @@ -925,7 +925,7 @@ anyTyCon = mkFamilyTyCon anyTyConName kind [kKiVar] Nothing Nothing NotInjective where - kind = ForAllTy (Named kKiVar Invisible) (mkTyVarTy kKiVar) + kind = ForAllTy (Named kKiVar Specified) (mkTyVarTy kKiVar) anyTypeOfKind :: Kind -> Type anyTypeOfKind kind = TyConApp anyTyCon [kind] diff --git a/compiler/prelude/TysWiredIn.hs b/compiler/prelude/TysWiredIn.hs index 3c3eab66bf..02e693d5a0 100644 --- a/compiler/prelude/TysWiredIn.hs +++ b/compiler/prelude/TysWiredIn.hs @@ -573,7 +573,7 @@ mk_tuple boxity arity = (tycon, tuple_con) in ( UnboxedTuple , gHC_PRIM - , mkInvForAllTys lev_tvs $ + , mkSpecForAllTys lev_tvs $ mkFunTys (map tyVarKind open_tvs) $ unliftedTypeKind , arity * 2 @@ -633,7 +633,7 @@ heqSCSelId, coercibleSCSelId :: Id klass = mkClass tvs [] [sc_pred] [sc_sel_id] [] [] (mkAnd []) tycon datacon = pcDataCon heqDataConName tvs [sc_pred] tycon - kind = mkInvForAllTys [kv1, kv2] $ mkFunTys [k1, k2] constraintKind + kind = mkSpecForAllTys [kv1, kv2] $ mkFunTys [k1, k2] constraintKind kv1:kv2:_ = drop 9 alphaTyVars -- gets "j" and "k" k1 = mkTyVarTy kv1 k2 = mkTyVarTy kv2 @@ -654,7 +654,7 @@ heqSCSelId, coercibleSCSelId :: Id klass = mkClass tvs [] [sc_pred] [sc_sel_id] [] [] (mkAnd []) tycon datacon = pcDataCon coercibleDataConName tvs [sc_pred] tycon - kind = mkInvForAllTys [kKiVar] $ mkFunTys [k, k] constraintKind + kind = mkSpecForAllTys [kKiVar] $ mkFunTys [k, k] constraintKind k = mkTyVarTy kKiVar [av,bv] = mkTemplateTyVars [k, k] tvs = [kKiVar, av, bv] |