instance Functor Set, was: Re: Export lists in modules

Malcolm Wallace Malcolm.Wallace at
Tue Feb 28 08:23:41 EST 2006

> > But if contexts-on-datatypes worked correctly,
> > 
> >     data Set a = Ord a => ....
> > 
> > then even the "real" map from Data.Set:
> > 
> >     map :: (Ord a, Ord b) => (a -> b) -> Set a -> Set b
> > 
> > could be an instance method of Functor. 
> I'd love that. But I don't quite understand:
> do you think this is/should be possible with:
> current Haskell? Haskell-Prime? Current ghc (what extensions)?

It is not possible currently, because of the H'98 language definition.
I do think it would be nice to fix this in Haskell-prime.  However,
although the idea is somewhat related to Polymorphic Components
there is no specific proposal about this issue on the wiki.  (It was
mentioned on some mailing list in the last couple of months, but I can't
find the thread now.)

By "working correctly" I mean that: it is a wart in Haskell'98 that you
can declare a datatype to require some class constraints on contained
elements, but that these extra constraints do not really buy you any
expressive power.  They just force you to repeat the same context decl
on every function that uses such a type.  Ideally, the data decl should
be more like an "alias", capturing the constraints as part of the
semantics associated with the type, so that you don't need to mention
the constraints at every usage location of the type.

Of course, there are some details to work out, about where you can
validly omit the constraints, and where they are still required.


More information about the Haskell-prime mailing list