[GHC] #14847: Inferring dependent kinds for non-recursive types

GHC ghc-devs at haskell.org
Fri Feb 23 16:40:56 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
      Resolution:                    |             Keywords:  TypeInType
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by simonpj:

Old description:

> 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
> }}}

New description:

 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
 }}}
 See also:
  * #14451
  * #12088
  * #9427

--

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14847#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list