Skip to content

Overzealous free-floating kind check causes deriving clause to be rejected

GHC rejects this program:

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
module Bug where

class C a b

data D = D deriving (C (a :: k))
GHCi, version 8.2.1: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/rgscott/.ghci
[1 of 1] Compiling Bug              ( Bug.hs, interpreted )

Bug.hs:8:1: error:
    Kind variable ‘k’ is implicitly bound in datatype
    ‘D’, but does not appear as the kind of any
    of its type variables. Perhaps you meant
    to bind it (with TypeInType) explicitly somewhere?
  |
8 | data D = D deriving (C (a :: k))
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

But it really shouldn't, since it's quite possible to write the code that is should generate:

instance C (a :: k) D

Curiously, this does not appear to happen for data family instances, as this typechecks:

{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Bug where

class C a b

data family D1
data instance D1 = D1 deriving (C (a :: k))

class E where
  data D2

instance E where
  data D2 = D2 deriving (C (a :: k))
Trac metadata
Trac field Value
Version 8.2.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information