RFC: Adding a Hashable type class and HashMap/HashSet data types
to HP
wren ng thornton
wren at freegeek.org
Sat Nov 27 02:12:36 EST 2010
On 11/24/10 11:41 AM, Duncan Coutts wrote:
> On 22 November 2010 01:19, wren ng thornton wrote:
>> +1. Especially given the recent trend towards breaking things out of base,
>> moving this in is suspect. As folks have been moving towards base-4 we've
>> been able to finally start getting rid of the slew of Cabal flags for
>> figuring out when base does or does not include various libraries. Don't
>> start inventing new ones :)
>
> It's not a simple question of "put stuff in base" vs "take stuff out
> of base" one has to look at what it is that it makes sense to put in /
> take out. The things we have been removing from base have mainly been
> independent implementations of things, not standard interfaces. There
> is a pretty reasonable argument that standard interfaces -- especially
> type classes -- should go in base, while almost all implementation do
> not need to be.
Right. My implication was that the module in question doesn't seem like
the kind of thing that should go in base. Generally used classes (sans
implementations) tend toward moving into base because having the class
sans implementation in its own package is cumbersome[1], and having the
class with its implementations introduces unnecessary dependencies.
However, that doesn't mean that all widely used classes should move into
base. For instance, consider the popular library Foo which defines a
FooClass; because Foo is widely used, FooClass will be too, but if Foo
is a graphics library or some other domain-specific thing, then FooClass
may not have the kind of generality that's appropriate for base classes.
While the idea of hashing is certainly general enough, I don't know that
this particular class definition of the idea is.[2] Compare against the
current development of classes for randomly generating values. The base
class is problematic, as has been known for some time, but the new
classes aren't settled in stone yet either. Not to mention that
QuickCheck, SmallCheck, etc have classes with similar goals of
constructing values "out of nothing" but whose goal is very different
than the statistically random generation of types like Int or Double. I
anticipate similar issues happening with hashing a few years down the
road once people have played around with the hashable/hashmap packages
more, and therefore do not think it should be included in base.
[1] Though not necessarily a bad idea. If each independent family of
classes were in their own package, then we could give those families
version numbers of their own instead of trying to remember which version
of base/quickcheck/... added or removed some particular method. This, on
the whole, strikes me as a good idea since it puts the version numbers
where they belong and makes it clearer for using CPP to conditionalize
parts of the implementation. Unfortunately, it's a heavyweight solution
and cabal doesn't seem like quite the right tool to be tracking this
sort of thing.
[2] Things like groups, fields, etc have well-defined interfaces and so
it's easy to see whether they are complete and appropriate or not
(ignoring debates about whether the algebraic classes are the right
generalizations to be used). Even things like a class for monad
transformers are defined almost entirely based on the types that things
must have. But hashing doesn't have the same kind of well-defined
structure as either of these.
--
Live well,
~wren
More information about the Libraries
mailing list