Overlapping instances in existentials
Dean Herington
heringto@cs.unc.edu
Fri, 20 Jun 2003 13:59:02 -0400
Dylan Thurston wrote:
> On Thu, Jun 19, 2003 at 11:08:35AM -0500, Ed Komp wrote:
> > > | type BaseType = Either Integer ( Either Bool () )
> > > |
> > > | type Value = (Either Double BaseType)
> > > |
> > > | data Foo = forall x. (SubType x BaseType) => MkFoo x
> > > |
> > > | test :: Foo -> Value
> > > | test (MkFoo x) = inj x
> >
> >
> > 'x' is the variable I am concerned about.
> > Since it is an argument to MkFoo,
> > we know that (SubType x BaseType)
> > and we also know that:
> >
> > NOT (SubType Double BaseType), so 'x' cannot be instantiated as Double.
>
> I'm missing something. Why do we know NOT (SubType Double BaseType)?
> Nothing in the code above prevents you from having such an instance,
> does it?
Put another way, only with a "closed world" assumption could the compiler
"know" that NOT (SubType Double BaseType). GHC deliberately eschews such an
assumption, so that adding new instances doesn't change the semantics of a
program.
Dean