Skip to content

Datatypes cannot use a type family in their return kind

This typechecks:

{-# LANGUAGE TypeInType #-}

import Data.Kind

type Id (a :: Type) = a

data Foo :: Id Type

But changing the type synonym to a type family causes it to fail:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeInType #-}

import Data.Kind

type family Id (a :: Type) :: Type where
  Id a = a

data Foo :: Id Type
$ ghci Foo.hs
GHCi, version 8.2.1: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/rgscott/.ghci
[1 of 1] Compiling Main             ( Foo.hs, interpreted )

Foo.hs:9:1: error:
    • Kind signature on data type declaration has non-* return kind
        Id *
    • In the data declaration for ‘Foo’
  |
9 | data Foo :: Id Type
  | ^^^^^^^^

That error message is wrong, since Id * = *. And, besides, the definition should be accepted.

EDIT: This was originally about the error message. But #14042 (closed) changes the goal of the bug to fix the behavior.

Edited by Richard Eisenberg
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information