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