[GHC] #14847: Inferring dependent kinds for non-recursive types
GHC
ghc-devs at haskell.org
Fri Feb 23 16:40:16 UTC 2018
#14847: Inferring dependent kinds for non-recursive types
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.2.2
Keywords: TypeInType | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
Consider this
{{{
data Proxy k (a :: k) = MkProxy
data Proxy2 k a = MkP (Proxy k a)
}}}
which is discussed in [http://downloads.haskell.org/~ghc/master/users-
guide/glasgow_exts.html#inferring-dependency-in-datatype-declarations 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
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14847>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list