Existential Typing (was Multi-parameter OOP)

George Russell ger@tzi.de
Thu, 25 Oct 2001 12:25:58 +0200


Leon Smith wrote:
[snip]
> If GHC had true existential typing, as opposed to just existential datatypes,
> you could reasonably code what I think you want like this:
> 
> class A a where
>     basicA :: Bool
>     nextA  :: a -> (EX a'. A a' => a')
>     basicA = True
>     nextA  = id
> 
> data WrappedA = forall a. A a => WrappedA a
> 
> instance A WrappedA where
>     basicA = False
>     nextA (WrappedA a) = a
> 
> data A1 = A1
> 
> instance A A1
> 
> --... similarly for B ...
> 
> class AB a b where
>    toBool :: a -> b -> Bool
> 
> instance (A a, B b) => AB a b where
>    toBool a b
>       | (basicA :: a) && (basicB :: b) = True
>       | (basicA :: a) || (basicB :: b) = False
>       | otherwise = toBool (nextA a) (nextB b)
[snip]
Either I've missed something, or this isn't what I wanted.  The problem I have is that
AB is not extensible.  If you want to add a new instances A2,B2 of A,B and a new definition
of toBool which just works for A2 and B2, you can't do it, without changing the definition of
toBool in the above instance.