[GHC] #9301: Rank-2 constraints are assigned kind *

GHC ghc-devs at haskell.org
Sat Jul 12 05:00:01 UTC 2014


#9301: Rank-2 constraints are assigned kind *
-------------------------------------+------------------------------------
        Reporter:  heisenbug         |            Owner:
            Type:  bug               |           Status:  new
        Priority:  normal            |        Milestone:
       Component:  Compiler          |          Version:  7.8.2
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  Unknown/Multiple
 Type of failure:  None/Unknown      |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+------------------------------------
Description changed by heisenbug:

Old description:

> Compile this program with GHC-HEAD (I have 7.9.20140605, but I guess
> 7.8.3 will also do):
> {{{
> {-# LANGUAGE RankNTypes #-}
>
> strangelet :: (forall t . Num t) => ()
> strangelet = \_ -> ()
> }}}
>
> Very strangely it gets accepted!
> {{{
> *Main> :t strangelet
> strangelet :: (forall t. Num t) -> ()
> }}}
> I suspect that the type checker assigns kind `*` to rank-2 constraints.
> Of course it should assign a `Constraint` kind.
>
> What I ultimately want is to declare:
> {{{
> foo :: (Monad m, forall n . Num (m n)) => m n
> foo = ...
> }}}
> ..or such. Would that be unreasonable?
>
> NB: 7.4.2 rejects it (even with `-XConstraintKinds`). I did not try
> 7.6.3.

New description:

 Compile this program with GHC-HEAD (I have 7.9.20140605, but I guess 7.8.3
 will also do):
 {{{
 {-# LANGUAGE RankNTypes #-}

 strangelet :: (forall t . Num t) => ()
 strangelet = \_ -> ()
 }}}

 Very strangely it gets accepted!
 {{{
 *Main> :t strangelet
 strangelet :: (forall t. Num t) -> ()
 }}}
 I suspect that the type checker assigns kind `*` to rank-2 constraints. Of
 course it should assign a `Constraint` kind.

 What I ultimately want is to declare:
 {{{
 foo :: (Monad m, forall n . Num (m n)) => m n
 foo = ...
 }}}
 ...or such. Would that be unreasonable?

 NB: 7.4.2 rejects it (even with `-XConstraintKinds`). I did not try 7.6.3.

--

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


More information about the ghc-tickets mailing list