summaryrefslogtreecommitdiff
path: root/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
diff options
context:
space:
mode:
authorJan Stolarek <jan.stolarek@p.lodz.pl>2014-07-11 13:54:45 +0200
committerJan Stolarek <jan.stolarek@p.lodz.pl>2015-09-03 05:55:15 +0200
commit374457809de343f409fbeea0a885877947a133a2 (patch)
treea354d0f4ddb6c32e6c85b853071d2107f6b8398c /libraries/template-haskell/Language/Haskell/TH/Syntax.hs
parentbd16e0bc6af13f1347235782935f7dcd40b260e2 (diff)
downloadhaskell-374457809de343f409fbeea0a885877947a133a2.tar.gz
Injective type families
For details see #6018, Phab:D202 and the wiki page: https://ghc.haskell.org/trac/ghc/wiki/InjectiveTypeFamilies This patch also wires-in Maybe data type and updates haddock submodule. Test Plan: ./validate Reviewers: simonpj, goldfire, austin, bgamari Subscribers: mpickering, bgamari, alanz, thomie, goldfire, simonmar, carter Differential Revision: https://phabricator.haskell.org/D202 GHC Trac Issues: #6018
Diffstat (limited to 'libraries/template-haskell/Language/Haskell/TH/Syntax.hs')
-rw-r--r--libraries/template-haskell/Language/Haskell/TH/Syntax.hs29
1 files changed, 24 insertions, 5 deletions
diff --git a/libraries/template-haskell/Language/Haskell/TH/Syntax.hs b/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
index 9f7b5107f0..82e22dd212 100644
--- a/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
+++ b/libraries/template-haskell/Language/Haskell/TH/Syntax.hs
@@ -1367,9 +1367,10 @@ data Dec
-- | pragmas
| PragmaD Pragma -- ^ @{ {\-# INLINE [1] foo #-\} }@
- -- | type families (may also appear in [Dec] of 'ClassD' and 'InstanceD')
- | FamilyD FamFlavour Name
- [TyVarBndr] (Maybe Kind) -- ^ @{ type family T a b c :: * }@
+ -- | data families (may also appear in [Dec] of 'ClassD' and 'InstanceD')
+ | DataFamilyD Name [TyVarBndr]
+ (Maybe Kind)
+ -- ^ @{ data family T a b c :: * }@
| DataInstD Cxt Name [Type]
[Con] [Name] -- ^ @{ data instance Cxt x => T [x] = A x
@@ -1380,9 +1381,17 @@ data Dec
-- deriving (Z,W)}@
| TySynInstD Name TySynEqn -- ^ @{ type instance ... }@
+ -- | open type families (may also appear in [Dec] of 'ClassD' and 'InstanceD')
+ | OpenTypeFamilyD Name
+ [TyVarBndr] FamilyResultSig
+ (Maybe InjectivityAnn)
+ -- ^ @{ type family T a b c = (r :: *) | r -> a b }@
+
| ClosedTypeFamilyD Name
- [TyVarBndr] (Maybe Kind)
- [TySynEqn] -- ^ @{ type family F a b :: * where ... }@
+ [TyVarBndr] FamilyResultSig
+ (Maybe InjectivityAnn)
+ [TySynEqn]
+ -- ^ @{ type family F a b = (r :: *) | r -> a where ... }@
| RoleAnnotD Name [Role] -- ^ @{ type role T nominal representational }@
| StandaloneDerivD Cxt Type -- ^ @{ deriving instance Ord a => Ord (Foo a) }@
@@ -1493,6 +1502,16 @@ data TyVarBndr = PlainTV Name -- ^ @a@
| KindedTV Name Kind -- ^ @(a :: k)@
deriving( Show, Eq, Ord, Data, Typeable, Generic )
+-- | Type family result signature
+data FamilyResultSig = NoSig -- ^ no signature
+ | KindSig Kind -- ^ @k@
+ | TyVarSig TyVarBndr -- ^ @= r, = (r :: k)@
+ deriving( Show, Eq, Ord, Data, Typeable, Generic )
+
+-- | Injectivity annotation
+data InjectivityAnn = InjectivityAnn Name [Name]
+ deriving ( Show, Eq, Ord, Data, Typeable, Generic )
+
data TyLit = NumTyLit Integer -- ^ @2@
| StrTyLit String -- ^ @"Hello"@
deriving ( Show, Eq, Ord, Data, Typeable, Generic )