[GHC] #8185: Change role annotation syntax
GHC
ghc-devs at haskell.org
Tue Sep 10 04:33:12 CEST 2013
#8185: Change role annotation syntax
----------------------------+----------------------------------------------
Reporter: | Owner: goldfire
goldfire | Status: new
Type: feature | Milestone: 7.8.1
request | Version: 7.7
Priority: normal | Keywords:
Component: | Architecture: Unknown/Multiple
Compiler | Difficulty: Moderate (less than a day)
Resolution: | Blocked By:
Operating System: | Related Tickets:
Unknown/Multiple |
Type of failure: |
None/Unknown |
Test Case: |
Blocking: |
----------------------------+----------------------------------------------
Comment (by goldfire):
In a late afternoon conversation, Stephanie and I seemed to make some
progress here.
Of the three main alternatives I presented a few days ago, we agreed that
the first was best, but with `type role` instead of `type roles`, to be
consistent with the wealth of other, singular keywords.
Why?
* It makes the most sense with the different declaration forms that it
affects. In particular, anything involving a `where` clause is awkward
with non-GADT datatype declarations. We also toyed around with using a
`deriving` clause, but that's awkward in general and in particular with
classes. We even considered a `roles` clause that would syntactically be
like `deriving`, but that would have to make `roles` a keyword.
* Stephanie was very against my idea of including the role within the
kind, because a role is really quite separate from a kind. The "include
with kind" idea also makes using CPP for compatibility control rather
painful.
* Having separate role declarations makes dealing with backward
compatibility more palatable, as a library author can lump all of a
module's role declarations in one place, cordon the place off with an
`#if`, and move on. Not quite as seamless as a pragma, but not so bad,
either.
* As Iavor pointed out in an email to me, having a separate declaration
allows roles to be declared for promoted types. It's not clear to me what
the value of this is, exactly, but it certainly won't hurt anyone. Knowing
this community, someone will find a use for this feature.
So, concretely, I propose the following form:
A role declaration looks like
{{{
type role <typename> <roles>
}}}
where `<typename>` is the name of the type being decorated (operators put
in parentheses as usual). `<roles>` will be spelled out and in lowercase:
{{{
type role Map nominal representational
}}}
The first word of the line will always be `type`, regardless of whether
the actual declaration is a `data` or a `class`. (Separately (#8234), it
has been decided to retract role annotations on type synonyms as too
fragile.) If a role is to be inferred, it can be left out with `_`:
{{{
type role Map' nominal _
}}}
The number of roles given in a declaration must exactly match the number
of (type, not kind) parameters in the real type declaration, including
unnamed parameters in a GADT-style declaration.
Role declarations are allowed for `data` and `class` types, and for
promoted types, but not for families or other type-level declarations.
How does this sound?
Once implementation is under way, I'll add this proposal to [wiki:Roles]
on the wiki. And, of course, I'll add notes in the user manual.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8185#comment:11>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list