[commit: template-haskell] overlapping-tyfams: Changed syntax to allow closed type families (b9dc6ad)
Richard Eisenberg
eir at cis.upenn.edu
Fri Jun 21 15:18:07 CEST 2013
Repository : ssh://darcs.haskell.org//srv/darcs/packages/template-haskell
On branch : overlapping-tyfams
http://hackage.haskell.org/trac/ghc/changeset/b9dc6ad769a4015ceba419ddf993159f0bf32bca
>---------------------------------------------------------------
commit b9dc6ad769a4015ceba419ddf993159f0bf32bca
Author: Richard Eisenberg <eir at cis.upenn.edu>
Date: Tue Jun 18 17:40:14 2013 +0100
Changed syntax to allow closed type families
>---------------------------------------------------------------
Language/Haskell/TH/Lib.hs | 18 +++++++++++++++---
Language/Haskell/TH/Ppr.hs | 14 +++++++++-----
Language/Haskell/TH/Syntax.hs | 21 ++++++++++-----------
3 files changed, 34 insertions(+), 19 deletions(-)
diff --git a/Language/Haskell/TH/Lib.hs b/Language/Haskell/TH/Lib.hs
index 71adf66..e29463b 100644
--- a/Language/Haskell/TH/Lib.hs
+++ b/Language/Haskell/TH/Lib.hs
@@ -424,11 +424,23 @@ newtypeInstD ctxt tc tys con derivs =
con1 <- con
return (NewtypeInstD ctxt1 tc tys1 con1 derivs)
-tySynInstD :: Name -> [TySynEqnQ] -> DecQ
-tySynInstD tc eqns =
+tySynInstD :: Name -> TySynEqnQ -> DecQ
+tySynInstD tc eqn =
+ do
+ eqn1 <- eqn
+ return (TySynInstD tc eqn1)
+
+closedTypeFamilyNoKindD :: Name -> [TyVarBndr] -> [TySynEqnQ] -> DecQ
+closedTypeFamilyNoKindD tc tvs eqns =
+ do
+ eqns1 <- sequence eqns
+ return (ClosedTypeFamilyD tc tvs Nothing eqns1)
+
+closedTypeFamilyKindD :: Name -> [TyVarBndr] -> Kind -> [TySynEqnQ] -> DecQ
+closedTypeFamilyKindD tc tvs kind eqns =
do
eqns1 <- sequence eqns
- return (TySynInstD tc eqns1)
+ return (ClosedTypeFamilyD tc tvs (Just kind) eqns1)
tySynEqn :: [TypeQ] -> TypeQ -> TySynEqnQ
tySynEqn lhs rhs =
diff --git a/Language/Haskell/TH/Ppr.hs b/Language/Haskell/TH/Ppr.hs
index 99f0564..d7200c4 100644
--- a/Language/Haskell/TH/Ppr.hs
+++ b/Language/Haskell/TH/Ppr.hs
@@ -275,18 +275,22 @@ ppr_dec isTop (NewtypeInstD ctxt tc tys c decs)
where
maybeInst | isTop = text "instance"
| otherwise = empty
-ppr_dec isTop (TySynInstD tc eqns)
- | [TySynEqn tys rhs] <- eqns
+ppr_dec isTop (TySynInstD tc (TySynEqn tys rhs))
= ppr_tySyn maybeInst tc (sep (map pprParendType tys)) rhs
- | otherwise
- = hang (text "type instance where")
- nestDepth (vcat (map ppr_eqn eqns))
where
maybeInst | isTop = text "instance"
| otherwise = empty
+ppr_dec isTop (ClosedTypeFamilyD tc tvs mkind eqns)
+ = hang (hsep [ text "type family", ppr tc, hsep (map ppr tvs), maybeKind
+ , text "where" ])
+ nestDepth (vcat (map ppr_eqn eqns))
+ where
+ maybeKind | (Just k') <- mkind = text "::" <+> ppr k'
+ | otherwise = empty
ppr_eqn (TySynEqn lhs rhs)
= ppr tc <+> sep (map pprParendType lhs) <+> text "=" <+> ppr rhs
+
ppr_data :: Doc -> Cxt -> Name -> Doc -> [Con] -> [Name] -> Doc
ppr_data maybeInst ctxt t argsDoc cs decs
= sep [text "data" <+> maybeInst
diff --git a/Language/Haskell/TH/Syntax.hs b/Language/Haskell/TH/Syntax.hs
index 62b1999..7a8a3f8 100644
--- a/Language/Haskell/TH/Syntax.hs
+++ b/Language/Haskell/TH/Syntax.hs
@@ -862,7 +862,8 @@ data Info
| TyConI
Dec
- -- | A type or data family, with a list of its visible instances
+ -- | A type or data family, with a list of its visible instances. A closed
+ -- type family is returned with 0 instances.
| FamilyI
Dec
[InstanceDec]
@@ -1170,18 +1171,16 @@ data Dec
| NewtypeInstD Cxt Name [Type]
Con [Name] -- ^ @{ newtype instance Cxt x => T [x] = A (B x)
-- deriving (Z,W)}@
- | TySynInstD Name [TySynEqn] -- ^
- -- @
- -- { type instance where { T ... = ...
- -- ; T ... = ... } }
- -- @
- --
- -- @type instance T ... = ...@ is used when
- -- the list has length 1
+ | TySynInstD Name TySynEqn -- ^ @{ type instance ... }@
+
+ | ClosedTypeFamilyD Name
+ [TyVarBndr] (Maybe Kind)
+ [TySynEqn] -- ^ @{ type family F a b :: * where ... }@
deriving( Show, Eq, Data, Typeable )
--- | One equation of a (branched) type family instance. The arguments are the
--- left-hand-side type patterns and the right-hand-side result.
+-- | One equation of a type family instance or closed type family. The
+-- arguments are the left-hand-side type patterns and the right-hand-side
+-- result.
data TySynEqn = TySynEqn [Type] Type
deriving( Show, Eq, Data, Typeable )
More information about the ghc-commits
mailing list