[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