On Wed, 8 Jan 2003 07:19 am, Hal Daume III wrote:
> Another way to do it would be to define a "universal" type:
> > data Univ = UUnit () | UInteger Integer | UDouble Double | ...
>
I'm fairly new to Haskell, but worked on Mercury until recently.
Mercury has a type "univ" which might be declared something like:
data Univ = Univ a
(I don't know the correct syntax for existentially quantified types in
haskell, but the intent of the declaration is that the monomorphic type Univ
has a single constructor is a value of existentially quantified type)
The library then has functions that do the equivalent of
mkUniv :: a -> Univ
and
getValue :: Univ -> Maybe a
The interesting bit is getValue. In implementation terms, what it does is
compare the dictionary stored in the Univ value (values containing
existentially quantified components also contain the dictionary for the
existentially quantified type variables) with the one that is implicitly
passed in for the result type. As it happens, almost all of this can be
done in Mercury using some of the reflection libraries.
I believe (nth hand) that something similar has been done in haskell, but my
understanding is that it isn't in the standard library.
Tom
--
Dr Thomas Conway Multimedia Database Systems, RMIT University
<[EMAIL PROTECTED]> 499 User error! Replace user, and press any key.
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell