[GHC] #4259: Relax restrictions on type family instance overlap
GHC
cvs-ghc at haskell.org
Fri Aug 20 02:46:22 EDT 2010
#4259: Relax restrictions on type family instance overlap
----------------------------------------+-----------------------------------
Reporter: lilac | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler (Type checker) | Version: 6.12.1
Keywords: | Testcase:
Blockedby: 4232 | Difficulty:
Os: Unknown/Multiple | Blocking:
Architecture: Unknown/Multiple | Failure: None/Unknown
----------------------------------------+-----------------------------------
Changes (by simonpj):
* cc: dimitris@… (added)
Comment:
I agree with Manuel points, but I can see the attraction of Lilac's
suggestion. Leaving aside the exact rules, the point is that the rules
for `LessEq` ''are'' confluent, even though more than one may apply. I
wonder whether this is an unusual example, or whether there are many like
it?
Beyond that, I think it's true that one can have two overlapping
instances, even if their RHSs are entirely different, provided they are
given together. Thus
{{{
type family F a
type instance F [a] = Bool
type instance F [Int] = Char
}}}
Now, the term `F [Char]` is unambiguously equal to `Bool`. But `F [b]`
can't reduce, because we don't know what `b` will be instantiated to.
On reflection though, I was too hasty in making this suggestion yesterday.
It might be fine for a ''source'' language, but I'm not sure how to
express it in System FC, the ''intermediate'' language. If we have the
above two rules as axioms we could just compose them in sequence to get
`Bool ~ Char` which is obvious nonsense. The only decent approach I can
see is for the first rule to take a proof that `a` is ''not'' `Int`, and
that seems pretty complicated.
So I'm not sure of the best way to proceed here.
Simon
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4259#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the Glasgow-haskell-bugs
mailing list