Existential types: want better syntactic support (autoboxing?)

Duncan Coutts duncan.coutts at worc.ox.ac.uk
Tue Jan 31 09:07:12 EST 2006


On Tue, 2006-01-31 at 13:28 +0000, Duncan Coutts wrote:
> On Tue, 2006-01-31 at 13:59 +0100, Wolfgang Jeltsch wrote:
> > Am Montag, 30. Januar 2006 19:02 schrieb Duncan Coutts:
> > > [...]
> > 
> > > I have often thought that it would be useful to have an existential
> > > corresponding to a class.
> > 
> > How would this work with multi-parameter classes, constructor classes, etc.? 
> > If you propose something that only works in conjunction with a special kind 
> > of classes I would hesitate to include such thing in a Haskell standard.
> 
> As John Mecham said it'd be for single parameter type class with a
> parameter of kind *.
> 
> But you're probably right that people should get more experience with
> using this technique before giving special support in the language to
> make it convenient.
> 
> As Bulat noted we can already use this construction:
> 
> class (Monad m) => Stream m h | h->m where
>     vClose :: h -> m ()
>     vIsEOF :: h -> m Bool
>     .....
> 
> data Handle = forall h . (Stream IO h) => Handle h
> 
> instance Stream IO Handle where
>     vClose        (Handle h) = vClose        h
>     vIsEOF        (Handle h) = vIsEOF        h
>     .....
> 
> But we have to give the name of the most general instance a different
> name to the class which is rather inconvenient.
> 
> So perhaps we should start with allowing a class a data type to have the
> same name and in a future standard think about making it easy to define
> Bulat's Handle instance above with a short hand like:
> 
> class (Monad m) => Stream m h | h->m where
>     vClose :: h -> m ()
>     vIsEOF :: h -> m Bool
>     .....
>   deriving data Stream

Actually this is unnecessary. All we need is:

class (Monad m) => Stream m h | h->m where
    vClose :: h -> m ()
    vIsEOF :: h -> m Bool

newtype Handle = exists s. Stream s => Handle s
  deriving Stream


So all we need is existentials and newtype-deriving.

Duncan



More information about the Haskell-prime mailing list