Skip to content

Type synonyms are not expanded in the data type declaration return kind

I was playing around with the cool new -XTypeInType stuff when I encountered the following issue:

{-# LANGUAGE TypeInType #-}
{-# LANGUAGE GADTs #-}
module TypeInTypeBug where

import qualified Data.Kind


-- This works, using Data.Kind.Type as return kind
--------------vvvvvvvvvvvvvv
data Works :: Data.Kind.Type where
  WorksConstr :: Works

type Set = Data.Kind.Type

-- This doesn't work, using a type synonym for Data.Kind.Type as return kind
---------------vvv
data Doesnt :: Set where
  DoesntConstr :: Doesnt
TypeInTypeBug.hs:17:1: error:
    • Kind signature on data type declaration has non-* return kind Set
    • In the data declaration for ‘Doesnt’

I suppose type synonyms should be expanded in the return kind of a data type declaration before checking it is *.

I also think the error message is not totally correct, take the following valid data declaration:

data Foo :: Bool -> Data.Kind.Type where
    Tru :: Foo True
    Fal :: Foo False

The return kind of the data declaration is actually Bool -> Data.Kind.Type (or Bool -> *), which is not *. I assume the error message is talking about the return kind (*) of the return kind (Bool -> *)

Trac metadata
Trac field Value
Version 7.11
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC goldfire
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information