[commit: ghc] ghc-8.0: Use CoercionN and friends in TyCoRep (3b80156)
git at git.haskell.org
git at git.haskell.org
Thu Feb 18 12:02:30 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : ghc-8.0
Link : http://ghc.haskell.org/trac/ghc/changeset/3b80156c4c921a44f917d0e666e4f74137fbffb4/ghc
>---------------------------------------------------------------
commit 3b80156c4c921a44f917d0e666e4f74137fbffb4
Author: Richard Eisenberg <eir at cis.upenn.edu>
Date: Wed Feb 10 08:03:56 2016 -0500
Use CoercionN and friends in TyCoRep
(cherry picked from commit 6f952f58bc4d592265134e4e13af46da9c56560f)
>---------------------------------------------------------------
3b80156c4c921a44f917d0e666e4f74137fbffb4
compiler/types/Coercion.hs | 7 -------
compiler/types/TyCoRep.hs | 34 +++++++++++++++++++++-------------
2 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/compiler/types/Coercion.hs b/compiler/types/Coercion.hs
index 3adec4e..7a14160 100644
--- a/compiler/types/Coercion.hs
+++ b/compiler/types/Coercion.hs
@@ -133,13 +133,6 @@ import Control.Monad (foldM)
import Control.Arrow ( first )
import Data.Function ( on )
------------------------------------------------------------------
--- These synonyms are very useful as documentation
-
-type CoercionN = Coercion -- nominal coercion
-type CoercionR = Coercion -- representational coercion
-type CoercionP = Coercion -- phantom coercion
-
{-
%************************************************************************
%* *
diff --git a/compiler/types/TyCoRep.hs b/compiler/types/TyCoRep.hs
index 0971b77..5bef692 100644
--- a/compiler/types/TyCoRep.hs
+++ b/compiler/types/TyCoRep.hs
@@ -33,6 +33,7 @@ module TyCoRep (
-- Coercions
Coercion(..), LeftOrRight(..),
UnivCoProvenance(..), CoercionHole(..),
+ CoercionN, CoercionR, CoercionP, KindCoercion,
-- Functions over types
mkTyConTy, mkTyVarTy, mkTyVarTys,
@@ -207,10 +208,10 @@ data Type
| CastTy
Type
- Coercion -- ^ A kind cast. The coercion is always nominal.
- -- INVARIANT: The cast is never refl.
- -- INVARIANT: The cast is "pushed down" as far as it
- -- can go. See Note [Pushing down casts]
+ KindCoercion -- ^ A kind cast. The coercion is always nominal.
+ -- INVARIANT: The cast is never refl.
+ -- INVARIANT: The cast is "pushed down" as far as it
+ -- can go. See Note [Pushing down casts]
| CoercionTy
Coercion -- ^ Injection of a Coercion into a type
@@ -573,11 +574,11 @@ data Coercion
-- we expand synonyms eagerly
-- But it can be a type function
- | AppCo Coercion Coercion -- lift AppTy
+ | AppCo Coercion CoercionN -- lift AppTy
-- AppCo :: e -> N -> e
-- See Note [Forall coercions]
- | ForAllCo TyVar Coercion Coercion
+ | ForAllCo TyVar KindCoercion Coercion
-- ForAllCo :: _ -> N -> e -> e
-- These are special
@@ -607,15 +608,15 @@ data Coercion
-- Using NthCo on a ForAllCo gives an N coercion always
-- See Note [NthCo and newtypes]
- | LRCo LeftOrRight Coercion -- Decomposes (t_left t_right)
+ | LRCo LeftOrRight CoercionN -- Decomposes (t_left t_right)
-- :: _ -> N -> N
- | InstCo Coercion Coercion
+ | InstCo Coercion CoercionN
-- :: e -> N -> e
-- See Note [InstCo roles]
-- Coherence applies a coercion to the left-hand type of another coercion
-- See Note [Coherence]
- | CoherenceCo Coercion Coercion
+ | CoherenceCo Coercion KindCoercion
-- :: e -> N -> e
-- Extract a kind coercion from a (heterogeneous) type coercion
@@ -623,11 +624,16 @@ data Coercion
| KindCo Coercion
-- :: e -> N
- | SubCo Coercion -- Turns a ~N into a ~R
+ | SubCo CoercionN -- Turns a ~N into a ~R
-- :: N -> R
deriving (Data.Data, Data.Typeable)
+type CoercionN = Coercion -- always nominal
+type CoercionR = Coercion -- always representational
+type CoercionP = Coercion -- always phantom
+type KindCoercion = CoercionN -- always nominal
+
-- If you edit this type, you may need to update the GHC formalism
-- See Note [GHC Formalism] in coreSyn/CoreLint.hs
data LeftOrRight = CLeft | CRight
@@ -983,10 +989,12 @@ role and kind, which is done in the UnivCo constructor.
data UnivCoProvenance
= UnsafeCoerceProv -- ^ From @unsafeCoerce#@. These are unsound.
- | PhantomProv Coercion -- ^ See Note [Phantom coercions]
+ | PhantomProv KindCoercion -- ^ See Note [Phantom coercions]. Only in Phantom
+ -- roled coercions
- | ProofIrrelProv Coercion -- ^ From the fact that any two coercions are
- -- considered equivalent. See Note [ProofIrrelProv]
+ | ProofIrrelProv KindCoercion -- ^ From the fact that any two coercions are
+ -- considered equivalent. See Note [ProofIrrelProv].
+ -- Can be used in Nominal or Representational coercions
| PluginProv String -- ^ From a plugin, which asserts that this coercion
-- is sound. The string is for the use of the plugin.
More information about the ghc-commits
mailing list