Opened 8 months ago

Closed 8 months ago

Last modified 7 months ago

#16334 closed bug (fixed)

Named wildcards in kinds

Reported by: int-index Owned by:
Priority: normal Milestone: 8.10.1
Component: Compiler (Type checker) Version: 8.4.4
Keywords: PartialTypeSignatures Cc: RyanGlScott, goldfire, simonpj
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: GHC rejects valid program Test Case: T16334
Blocked By: Blocking:
Related Tickets: Differential Rev(s): https://gitlab.haskell.org/ghc/ghc/merge_requests/361
Wiki Page:

Description (last modified by int-index)

This works:

Prelude> :set -XNamedWildCards -XPartialTypeSignatures -XPolyKinds 
Prelude> k :: (Int :: _); k = 42

<interactive>:2:14: warning: [-Wpartial-type-signatures]
    • Found type wildcard ‘_’ standing for ‘*’
    • In the type signature: k :: (Int :: _)

And this doesn't:

Prelude> k :: (Int :: _t); k = 42

<interactive>:3:7: error:
    • Expected kind ‘_t’, but ‘Int’ has kind ‘*’
    • In the type signature: k :: (Int :: _t)

The issue, I suspect, is in partition_nwcs, which ignores kind variables for some reason.

Change History (5)

comment:1 Changed 8 months ago by simonpj

Keywords: PartialTypeSignatures added

comment:2 Changed 8 months ago by int-index

Description: modified (diff)
Differential Rev(s): https://gitlab.haskell.org/ghc/ghc/merge_requests/361
Status: newpatch

comment:3 Changed 8 months ago by int-index

Resolution: fixed
Status: patchclosed
Test Case: T16334

comment:4 Changed 8 months ago by RyanGlScott

Milestone: 8.10.1

comment:5 Changed 7 months ago by Marge Bot <ben+marge-bot@…>

In 5bc195b1/ghc:

Treat kind/type variables identically, demolish FKTV

Implements GHC Proposal #24: .../ghc-proposals/blob/master/proposals/0024-no-kind-vars.rst
Fixes Trac #16334, Trac #16315

With this patch, scoping rules for type and kind variables have been
unified: kind variables no longer receieve special treatment. This
simplifies both the language and the implementation.

User-facing changes
-------------------

* Kind variables are no longer implicitly quantified when an explicit
  forall is used:

    p ::             Proxy (a :: k)    -- still accepted
    p :: forall k a. Proxy (a :: k)    -- still accepted
    p :: forall   a. Proxy (a :: k)    -- no longer accepted

  In other words, now we adhere to the "forall-or-nothing" rule more
  strictly.

  Related function: RnTypes.rnImplicitBndrs

* The -Wimplicit-kind-vars warning has been deprecated.

* Kind variables are no longer implicitly quantified in constructor
  declarations:

    data T a        = T1 (S (a :: k) | forall (b::k). T2 (S b)  -- no longer accepted
    data T (a :: k) = T1 (S (a :: k) | forall (b::k). T2 (S b)  -- still accepted

  Related function: RnTypes.extractRdrKindSigVars

* Implicitly quantified kind variables are no longer put in front of
  other variables:

    f :: Proxy (a :: k) -> Proxy (b :: j)

    f :: forall k j (a :: k) (b :: j). Proxy a -> Proxy b   -- old order
    f :: forall k (a :: k) j (b :: j). Proxy a -> Proxy b   -- new order

  This is a breaking change for users of TypeApplications. Note that
  we still respect the dpendency order: 'k' before 'a', 'j' before 'b'.
  See "Ordering of specified variables" in the User's Guide.

  Related function: RnTypes.rnImplicitBndrs

* In type synonyms and type family equations, free variables on the RHS
  are no longer implicitly quantified unless used in an outermost kind
  annotation:

    type T = Just (Nothing :: Maybe a)         -- no longer accepted
    type T = Just Nothing :: Maybe (Maybe a)   -- still accepted

  The latter form is a workaround due to temporary lack of an explicit
  quantification method. Ideally, we would write something along these
  lines:

    type T @a = Just (Nothing :: Maybe a)

  Related function: RnTypes.extractHsTyRdrTyVarsKindVars

* Named wildcards in kinds are fixed (Trac #16334):

    x :: (Int :: _t)    -- this compiles, infers (_t ~ Type)

  Related function: RnTypes.partition_nwcs

Implementation notes
--------------------

* One of the key changes is the removal of FKTV in RnTypes:

  - data FreeKiTyVars = FKTV { fktv_kis    :: [Located RdrName]
  -                          , fktv_tys    :: [Located RdrName] }
  + type FreeKiTyVars = [Located RdrName]

  We used to keep track of type and kind variables separately, but
  now that they are on equal footing when it comes to scoping, we
  can put them in the same list.

* extract_lty and family are no longer parametrized by TypeOrKind,
  as we now do not distinguish kind variables from type variables.

* PatSynExPE and the related Note [Pattern synonym existentials do not scope]
  have been removed (Trac #16315). With no implicit kind quantification,
  we can no longer trigger the error.

* reportFloatingKvs and the related Note [Free-floating kind vars]
  have been removed. With no implicit kind quantification,
  we can no longer trigger the error.
Note: See TracTickets for help on using tickets.