[GHC] #9200: Milner-Mycroft failure at the kind level

GHC ghc-devs at haskell.org
Wed Jun 18 21:31:51 UTC 2014


#9200: Milner-Mycroft failure at the kind level
----------------------------------------------+----------------------------
        Reporter:  ekmett                     |            Owner:
            Type:  bug                        |           Status:  new
        Priority:  normal                     |        Milestone:
       Component:  Compiler (Type checker)    |          Version:  7.8.2
      Resolution:                             |         Keywords:
Operating System:  Unknown/Multiple           |     Architecture:
 Type of failure:  GHC rejects valid program  |  Unknown/Multiple
       Test Case:                             |       Difficulty:  Unknown
        Blocking:                             |       Blocked By:
                                              |  Related Tickets:
----------------------------------------------+----------------------------

Comment (by dolio):

 This example:

 {{{
 foo :: forall f a. f a -> f a
 foo = ...
     where
       g :: f Int -> Int
 }}}

 just seems like bad policy to me. The top signature is a partial
 signature, the missing pieces (the kinds) should be solved, and it is not
 sufficient to only look at the signature of `foo` to do that solving. I
 can construct similar examples in Ermine, although it is a bit convoluted
 due to our currently meager tooling:

 {{{
 :type
 let { f : forall f a. f a -> f a
     ; f x = x
     } in f

 forall {k} (f : k -> *) (a : k). f a -> f a
 }}}

 {{{
 :type
 let { f : forall f a. f a -> f a
     ; f x = x where
         { z = g x
         ; g : some f a b. f a -> f b -> b
         ; g _ _ = ""
         }
     } in f

 forall (f : * -> *) (a : *). f a -> f a
 }}}

 Effectively, this signature is the same as (for us)

 {{{
 some k1 k2. forall (f : k1) (a : k2). f a -> f a
 }}}

 although we don't currently handle some-bound kinds; unspecified kinds act
 similarly, though.

 The problem with this example seems to be deciding on things too early,
 not generalizing. For instance, doesn't PARTIAL error if you apply the
 same kind of policy to:

 {{{
 foo :: forall f a. f a -> f a
 foo = ...
     where
       g :: f Maybe -> f Maybe
 }}}

 `f` will be defaulted to `* -> *`, but that is wrong for application to
 `Maybe`.

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


More information about the ghc-tickets mailing list