[GHC] #11203: Kind inference with SigTvs is wrong
GHC
ghc-devs at haskell.org
Thu Dec 17 17:45:20 UTC 2015
#11203: Kind inference with SigTvs is wrong
-------------------------------------+-------------------------------------
Reporter: goldfire | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by goldfire):
Quite a bit of discussion has led to this general rule:
* Two user-written type variables, both in scope at the same time, should
always refer to distinct, unknown types.
Note that this rule is, in fact, violated sometimes:
{{{
f :: a -> a -> Int
f (x :: b) (y :: c) = 3
}}}
This definition is accepted, even though `b` and `c` share a scope and
refer to the same type. Under the general rule, this should be rejected.
Now that we have type wildcards, a user who really wanted to write
something like `f` can use wildcards.
Returning to the situation in the original ticket, the general rule would
allow `S`/`T` and prevent `Q`, as desired.
Now, how to implement: when creating a `SigTv`, we could record the set of
variables in scope at the time. Then, whenever we unify a `SigTv` with
another type, we just make sure that the other type can never unify with
any of those variables.
Specifically: let's write `SigTv{a,b}` to denote a `SigTv` type variable
flavor (a `MetaInfo`) that cannot unify with `a` or `b`. A tyvar `b` with
flavor `SigTv{vs}` may unify with a type `t` only when:
1. `t` is a type variable, `a`; AND
2. (`a` is a skolem; OR
3. `a` is a `SigTv{ws}` such that `ws` is a superset of `vs`)
Note that `ws` and `vs` may contain other `SigTv`s that have unified; it
might be necessary to zonk `ws` and `vs` before doing the superset check.
I offer no justification for why my approach might work. But I think it
would.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11203#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list