[Haskell-cafe] Proposal for associated type synonyms in Template
José Pedro Magalhães
jpm at cs.uu.nl
Tue Nov 11 06:11:03 EST 2008
I see this is a proposal for a partial implementation of #1673 (
http://hackage.haskell.org/trac/ghc/ticket/1673). Maybe it would be good if
the remaining syntax (associated datatypes and type families) would also be
defined and implemented in TH. Or maybe there isn't much demand for this?...
On Wed, Nov 5, 2008 at 15:57, Thomas van Noort <thomas at cs.ru.nl> wrote:
> Recently, we released a library on Hackage for generic rewriting (package
> "rewriting" if you are curious). The user of the library is expected to
> define type class instances to enable rewriting on his or her own datatypes.
> As these instances follow the datatype declarations closely, we tried to
> generate the instances using Template Haskell. Unfortunately, associated
> type synonyms are not yet supported by TH.
> After a presentation at the WGP'08, Simon encouraged us to write a proposal
> about adding associated type synonyms to TH, so that it can be added to GHC.
> So, here is our proposal.
> The TH AST must allow 1) kind declarations of associated type synonyms
> in class declarations and 2) their definitions in instance declarations.
> For example,
> class Foo a where
> type Bar a :: *
> instance Foo Int where
> type Bar Int = String
> The TH library defines a datatype Dec which contains a constructor for
> class declarations and instance declarations:
> data Dec
> = ...
> | ClassD Cxt Name [Name] [FunDep] [Dec]
> | InstanceD Cxt Type [Dec]
> 1) Associated type synonym kind declarations
> We suggest to add a constructor to the Dec type:
> | AssocTySynKindD Name [Name] (Maybe Kind)
> assocTySynKindD :: Name -> [Name] -> Maybe KindQ -> DecQ
> The first field is the name of the associated type synonym, the second
> field is a list of type variables, and the third field is an optional kind.
> Since kinds are not yet defined in TH, we have to add some kind of kind
> definition (pun intended):
> data Kind
> = StarK
> | ArrowK Kind Kind
> type KindQ = Q Kind
> starK :: KindQ
> arrowK :: KindQ -> KindQ -> KindQ
> We explicitly choose not to reuse the Type type to define kinds (i.e., type
> Kind = Type as in GHC) since we think a separation between the two worlds is
> much clearer to the users of TH.
> 2) Associated type synonym definitions
> We suggest to add another constructor to the Dec type:
> | AssocTySynD Name [Type] Type
> assocTySynD :: Name -> [TypeQ] -> TypeQ -> DecQ
> The first field is the name of the type synonym, the second field is a list
> of type arguments, and the third field is the body of the type synonym.
> We would like to hear your comments to this proposal.
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe