[Haskell] Long live Edison
Robert Dockins
robdockins at fastmail.fm
Tue Feb 21 17:52:01 EST 2006
On Feb 21, 2006, at 7:19 AM, Jean-Philippe Bernardy wrote:
> As you might know, I've been working on a class-based framework API to
> accomodate existing collection types, which I intend to be used in
> place of the concrete modules APIs. It can be found here:
>
> http://hackage.haskell.org/trac/ghc/wiki/CollectionClassFramework
>
> By all means, I'd be interested to have your feedback on my design. I
> don't mean that there can exist only one, but I guess we can benefit
> from each other's ideas.
Well, I have to begin with the caveat that I am not a data structures
expert, and that the design of Edison is almost entirely due to Chris
Okasaki. That said, I can certainly share my opinion. In no
particular order:
-- Your use of two type parameters to model read-only or unobservable
collections is very interesting. I wonder, though, how useful it
actually is. I facilitates some interesting possibilities with
views, but I can't think of any compelling use cases. I sort of
dislike the fact that it can turn certain of the class methods
"useless", but maybe the idea just hasn't grown on me yet.
-- I like the idea of views generally, and I'm now trying to think if
there is a good way to work something like them into Edison.
-- The 'isSingleton' method seems unnecessary. Are singleton
collections interesting enough to supply a special test for them?
-- Your 'lookup' method has a Monad context, which I assume is the
'NotJustMaybe' pattern, but 'front' and 'back' return Maybe. You
should probably pick one style and stick to it.
-- Qualified infix functions look horrible. I know you say this
module should be imported unqualified, but with Prelude clashes
people qualify it anyway. I'd suggest you stick to regular prefix
functions for your class methods and define the infix functions as
the appropriate aliases. That way people importing qualified can
still use something reasonable looking.
-- In a related thread I've been discussing argument orders. I think
I've just about come to the decision that all the Edison API
functions will take the collection argument last, including the
troublesome 'rcons'. If you take my suggestion to remove infix
symbols from your classes, I suggest you also make your right cons
and index functions take the collection argument last. However, I'd
probably leave the symbols as is, so that, e.g., (|>) = (flip rcons).
-- In fact, I like your right and left insert symbols so much, I may
adopt them myself.
-- You claim that 'union' takes an unspecified element in the case of
duplicates, but you also claim it is commutative. You need to
specify in what sense you claim commutativity; your collection class
doesn't require an Eq or Ord instance, and the claim seems very
suspect if you mean up to identity. Similar with intersection.
-- Does 'adjust' affect all elements with the given key, or just a
single unspecified one?
-- 'Indexed' doesn't have any notion of bounds. That seems like a
pretty necessary concept. Humm, I see now that MapLike is a subclass
of Indexed. Perhaps then you should have 'DenseIndexed' or
'ArrayLike' which has bounds related methods together with the
"denseness" property.
Overall, I'd say the methods you have carved out seem to be the ones
that are most-used, with the notable exception of 'head' and 'tail'
for sequences. If you are attempting to go for a fairly minimal set
of operations (that's more or less what I read your design goals as
saying), then the only method I'd consider adding is a strict fold.
People get irritated if they can't, e.g., sum the elements in a
collection without building a gajillion unnecessary closures.
Rob Dockins
Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
-- TMBG
More information about the Libraries
mailing list