From: Francesco Mazzoli <f@mazzo.li>

At Sat, 10 Nov 2012 15:16:30 +0100,
Alberto G. Corona  wrote:
> There is a ListLike package, which does this nice abstraction. but I don't
> know if it is ready for and/or enough complete for serious usage.  I?m
> thinking into using it for the same reasons.
>
> Anyone has some experiences to share about it?

I've used it in the past and it's solid, it's been around for a while and the
original author knows his Haskell.

Things I don't like:

* The classes are huge:
  <http://hackage.haskell.org/packages/archive/ListLike/3.1.6/doc/html/Data-ListLike.html#t:ListLike>.
  I'd much rater prefer to have all those utilities functions outside the type
  class, for no particular reason other then the ugliness of the type class.

Speaking as the ListLike maintainer, I'd like this too.  But it's difficult to do so without sacrificing performance.  In some cases, sacrificing *a lot* of performance.  So they have to be class members.

However, there's no reason ListLike has to remain a single monolithic class.  I'd prefer an API that's split up into several classes, as was done in Edison.  Then 'ListLike' itself would just be a type synonym, or possibly a small type class with the appropriate superclasses.

However this seems like a lot of work for relatively little payoff, which makes it a low priority for me.

* It defines its own wrappers for `ByteString':
  <http://hackage.haskell.org/packages/archive/ListLike/3.1.6/doc/html/Data-ListLike.html#t:CharString>.

The community's view on newtypes is funny.  On the one hand, I see all the time the claim "Just use a newtype wrapper to write instances for ..." (e.g. the recent suggestion of 'instance Num a => Num (a,a)'.  On the other, nobody actually seems to want to use these newtype wrappers.  Maybe it clutters the code?  I don't know.

I couldn't think of a better way to implement this functionality, patches would be gratefully accepted.  Anyway, you really shouldn't use these wrappers unless you're using a ByteString to represent ASCII text.  Which you shouldn't be doing anyway.  If you're using a ByteString to represent a sequence of bytes, you needn't ever encounter CharString.


* It doesn't have instances for `Text', you have to resort to the
  `listlike-instances' package.

Given that text and vector are both in the Haskell Platform, I wouldn't object to these instances being rolled into the main ListLike package.  Any comments on this?

John L.