[GHC] #12569: TypeApplications allows instantiation of implicitly-quantified kind variables (was: TypeApplications doesn't allow unticked list constructors.)

GHC ghc-devs at haskell.org
Mon Sep 5 06:53:29 UTC 2016


#12569: TypeApplications allows instantiation of implicitly-quantified kind
variables
-------------------------------------+-------------------------------------
        Reporter:  vagarenko         |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler (Type    |              Version:  8.0.1
  checker)                           |             Keywords:
      Resolution:                    |  TypeApplications
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by adamgundry):

 * cc: adamgundry, goldfire (added)
 * keywords:   => TypeApplications
 * component:  Compiler => Compiler (Type checker)


Comment:

 I believe the ticked/unticked constructor mechanism is working as
 designed, but you may be on to something with your "weird" example.

 == To tick or not to tick ==

 Without a tick, `[0]` as a type is in fact ill-kinded. `[0]` is syntactic
 sugar for `[] 0` where `[] :: * -> *` is the list type constructor.
 Moreover, `0` does not have kind `*`. This is why you get two errors from
 `foo @[0]`.

 With a tick, `'[0]` is syntactic sugar for `0 ': '[]` (i.e. a promoted
 list of one element) and has kind `[Nat]` as expected.

 A tick is necessary when a data constructor and type constructor have the
 same name, and you want to refer to the data constructor in the type
 namespace. In the case of `True` and `'True`, in the absence of a type
 constructor `True`, this is genuinely unambiguous and the tick is
 optional.

 == The actual bug ==

 (Whether the constructor is ticked or not is irrelevant here.)

 When you write `let foo :: forall (x :: k). (); foo = ()`, GHC implicitly
 quantifies over the kind variable `k` to give `foo :: forall k (x :: k) .
 ()`. I would expect that `k` would not be available for instantiation via
 a type application, but apparently it is, because `foo @True` is rejected
 but `foo @Bool @True` is accepted. I think we should have `foo :: forall
 {k} (x :: k) . ()` instead.

 @goldfire, would you agree that this should be changed? In any case, we
 should document this case in the manual.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12569#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list