Skip to content

Inferring dependent kinds for non-recursive types

Consider this

data Proxy k (a :: k) = MkProxy
data Proxy2 k a = MkP (Proxy k a)

which is discussed in a corner of the user manual.

Surprisingly, we reject Proxy2 -- but there is nothing difficult about inferring its kind. There would be if it was recursive -- but it isn't.

Simple solution: for non-recursive type declarations (we do SCC analysis so we know which these are) do not call getInitialKinds; instead, just infer the kind of the definition! Simple.

Warning: is this recursive?

data Proxy2 k a where
  MkP :: Proxy k a -> Proxy2 k a 

Presumably no more than the other definition. But currently we need Proxy2 in the environment during kind inference, because we kind-check the result type. That seems jolly odd and inconsistent. Needs more thought.

Similar questions for

data T a where
  T :: Int -> T Bool

type family F a where
  F Int = True
  F _   = False

See also:

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