[ghc-steering-committee] Proposal: Embrace Type in Type (#83)
Simon Peyton Jones
simonpj at microsoft.com
Tue Apr 17 08:08:28 UTC 2018
I think we all agree that we should collapse -XPolyKinds and -XTypeInType. The only issue is what to do about *. No solution is perfect: let's get this decided!
The status quo is terrible!
* With -XTypeInType,
- '*' means Type iff '*' is imported from Data.Kind
- '*' has no special meaning otherwise; that is, it's an
ordinary infix operator, and is used as such in TypeLits
- Ambiguity error if it is in scope two ways)
* Without -XTypeInType
- '*' means Type iff it is used in a context that syntactically
means "this is a kind"
- '*' has no special meaning otherwise
That is, the meaning of '*' depends both on the extension flags -- and moreover on a flag whose primary purpose is quite separate -- AND depends (in some cases) on lexical scope or (in other cases) on syntactic context. This is a ridiculous design.
The simplest thing to do is to say
* The meaning of '*' is controlled by a flag, -XStarIsType, that has no
other purpose
* -XStarIsType is on by default. (Perhaps: switched off by -XTypeOperators.)
* 'Type' is exported by Data.Type (or whatever) and is always available
as an alternative to '*'.
* When -XStarIsType is on, we print '*' in error messages whenever possible.
That is simple and explicable. Moreover the on-by-default rule means that most existing prams that use PolyKinds will continue to work unchanged. In effect -XStarIsType is roughly the delta between -XPolyKinds and -XTypeInType.
Once that is in place we can think about future policy. For example
- Leave it alone
- Announce that -XStarIsType will move to off-by-default in a
specified future GHC XX.YY,
and emit deprecation messages for three previous releases
But let's get this done, one way or another.
Simon
| -----Original Message-----
| From: ghc-steering-committee <ghc-steering-committee-
| bounces at haskell.org> On Behalf Of Joachim Breitner
| Sent: 16 April 2018 18:46
| To: ghc-steering-committee at haskell.org
| Subject: Re: [ghc-steering-committee] Proposal: Embrace Type in Type
|
| Hi,
|
| Am Montag, den 16.04.2018, 11:55 -0400 schrieb Richard Eisenberg:
| > An alternative that hasn't been suggested so far is to have
| > -XStarIsType control the pretty-printer as well as the parser. Simon
| > PJ and I discussed this this morning, thinking it was a good idea.
| > Upon further consideration, my preference would be to bite the
| bullet
| > and just switch to printing Type always, but I'm not really against
| > the print-*-with-XStarIsType idea.
|
| I’m with Simon here. We have, I believe, precedence where error
| messages are affected by the language extension in scope, so this
| might satisfy the principle of least surprise, and also cause the
| least contention among our users.
|
| We can still apply this rule when `-XNoStarIsType`:
|
| > One slightly separate question is what to print. The proposal
| > currently suggests to print Type. There was concern in this thread
| > that it would be printed fully-qualified, but I like Joachim's
| > suggestion in the last known email in this thread to special-case
| > printing of Type; even if it's not imported, it would print as Type,
| > not Data.Kind.Type. (Unless some other Type were in scope.) It is
| also
| > easy to teach GHC to print a bespoke warning when a user writes Type
| > when it is out of scope, telling them to import Data.Kind.
|
| The proposal currently does not state which modules export Type. I can
| infer from the text that it is Data.Kind, but this could be made
| explicit. Also, the proposal should state whether it is re-exported
| from Prelude or not (I assume it is not).
|
| Cheers,
| Joachim
|
| --
| Joachim Breitner
| mail at joachim-breitner.de
| http://www.joachim-breitner.de/
More information about the ghc-steering-committee
mailing list