# 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.