[GHC] #9200: Milner-Mycroft failure at the kind level
GHC
ghc-devs at haskell.org
Thu Jun 19 17:30:31 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 goldfire):
Replying to [comment:23 dolio]:
> Is the entire problem closed, partially annotated type families that are
non-parametric, and therefore act like GADT definitions and lack principal
types?
Not just these. Also partially annotated datatypes and classes will lack
principal kinds. Here is the example:
{{{
data W f (a :: k) where
MkW :: W Maybe Int -> W f a
}}}
Do we have `W :: (k -> *) -> k -> *` or `W :: (* -> *) -> k -> *`, among
others? Both seem reasonable, though the latter is certainly easier to
infer. To eliminate ambiguity, we have to add the restriction to (PARGEN).
This makes it clear that the second kind is the only allowable one.
> And is the motivation to then have a uniform rule for both these and
everything else that doesn't require detecting situations that would fail
to have a principal type?
Yes, that's my understanding.
>
> You (goldfire) and I discussed what we're doing in Ermine, which is now
quite a lot like the (original) PARGEN strategy.
From my understanding, your original implementation was like (PARGEN) +
side condition. Only after discussing did you (effectively) remove the
side condition.
> It seems to work for the sort of partially specified type signatures we
have, and it works for polymorphic recursion, including polymorphic
recursion with partial signatures. For instance:
>
> {{{
> let { u : a -> a -> a
> ; u x _ = x
> ; f : some b c. forall a. a -> b -> c
> ; f x y = let { z = u x y } in g x y
> ; g _ y = f () y
> } in f
> }}}
>
> Without the signature on `f` the inferred type is `() -> () -> c`, but
with it the inferred type is `b -> b -> c`.
I believe the original (PARGEN) "works", in that it is sound, for an
appropriate definition of sound. However, it can infer non-principal
types, which seems bad. I don't think it's very wrong for Ermine to adopt
(PARGEN) - side condition, but I have to say I don't think it's very
right, either.
I believe that the example you give has a principal type, which is
inferred correctly.
>
> Anyhow, I'm not particularly adamant about your choice of (original)
PARGEN vs. NEWCUSK. But I'd like to understand what exactly the objections
were, and whether they're tied to GADTs and type families.
I would say that the problems are wholly independent of GADTs and type
families. There is a problem with closed type families that is closely
related, but the fundamental problem is independent.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9200#comment:24>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list