Type Pattern-Matching for Existential Types

Ashley Yakeley ashley@semantic.org
Tue, 30 Jan 2001 21:47:36 -0800


At 2001-01-30 19:52, Fergus Henderson wrote:

>On 30-Jan-2001, Ashley Yakeley <ashley@semantic.org> wrote:
>> At 2001-01-30 02:37, Fergus Henderson wrote:
>> 
>> >class BaseClass s where
>> >	downcast_to_derived :: s -> Maybe Derived
>> 
>> Exactly what I was trying to avoid, since now every base class needs to 
>> know about every derived class. This isn't really a practical way to 
>> build an extensible type hierarchy.
>
>Right.
>
>I don't know of any way to do that in Hugs/ghc without the problem that
>you mention.  Really it needs language support, I think.
>(I have no idea if you can do it in O'Haskell.)

It can't be done in O'Haskell either...

Given that we have existential types, it would be nice to have a 
pattern-matching mechanism to get at the inside value. Something like...

--
data Any = forall a. Any a

get :: Any -> Maybe Char
get (Any (c::Char)) = Just c -- bad
get _ = Nothing
--

...but as it stands, this is not legal Haskell, according to Hugs:

ERROR "test.hs" (line 4): Type error in application
*** Expression     : Any c
*** Term           : c
*** Type           : Char
*** Does not match : _0
*** Because        : cannot instantiate Skolem constant

This, of course, is because the '::' syntax is for static typing. It 
can't be used as a dynamic pattern-test.

Question: how big of a change would it be to add this kind of pattern 
matching? Is this a small issue, or does it have large and horrible 
implications?

-- 
Ashley Yakeley, Seattle WA