Yeah, my answer on the ByteString front is to make a bunch of Reducers for a Builder data type that works like the one in Data.Binary.Builder. It generates a much more suitable Reducer and can reduce Chars, Strings, Strict and Lazy UTF8-encoded Bytestrings, etc. I&#39;m using that inside of my toy compiler right now when I need to generate output, like a Lazy ByteString of source. (My variant Builder -- ok, my mostly cut and pasted Builder, has been made slightly smarter and is now tuned to work with UTF8 encoded data, which is what I&#39;ve been feeding it lately.) I may migrate it into the monoids library from my current project if there is interest, but I&#39;m trying to avoid ballooning that up too far in size again and re-entering dependency hell.<div>
<div><br></div><div>The monoids library drew a pretty hard distinction between things that build up nicely (Monoids/Reducers) and things that tear down easily (Generators) but only works with a few things that do both efficiently (i.e. Seq/FingerTree) For my purposes this has worked rather well, but raw strict (and to a lesser degree, lazy) ByteStrings make abysmal Reducers. ;) </div>
<div><br></div><div><div>In the end, bolting a list-like interface on something that can be _made_ to implement all of the operations but can&#39;t be made to implement them remotely efficiently, seems like it is asking for trouble, bug reports about performance, and pain.</div>
<div><br></div></div><div>On the other hand, FingerTrees of wrapped strict ByteStrings work nicely as a monoidal lazy bytestring-like structure that provides an efficient snoc, indexing operation, and very efficient slicing for extracting token values with maximal sharing. I&#39;ll be giving a talk at the next Boston Haskell User Group in a few days about my abuse of those in a terrible hodge-podge solution of Iteratees, Parsec 3 and monoids, which yields an efficient parallel/incremental lexer.</div>
<div><br></div><div>I&#39;ll see about posting the slides afterwards.</div><div><br></div><div>-Edward Kmett<br><br><div class="gmail_quote">On Thu, Aug 13, 2009 at 4:43 PM, John Lato <span dir="ltr">&lt;<a href="mailto:jwlato@gmail.com">jwlato@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Thu, Aug 13, 2009 at 1:51 PM, Jake McArthur&lt;<a href="mailto:jake.mcarthur@gmail.com">jake.mcarthur@gmail.com</a>&gt; wrote:<br>

&gt; John Lato wrote:<br>
&gt;&gt;<br>
&gt;<br>
&gt;&gt; This might work with UVector (I intend to try it this evening); I<br>
&gt;&gt; don&#39;t know how well the fusion framework will hold up in class<br>
&gt;&gt; dictionaries.<br>
&gt;<br>
&gt; Do report back, as I am curious as well.<br>
<br>
</div>I have just recently hacked together a small test.  The code is at<br>
<a href="http://inmachina.net/~jwlato/haskell/testUVector.hs" target="_blank">http://inmachina.net/~jwlato/haskell/testUVector.hs</a><br>
<br>
The task is to generate a list of 1 million Ints (really 1e6-1), map a<br>
multiply by 2, and check to see if any values equal 0.  The uvector<br>
code is (essentially):<br>
<br>
&gt; let res = anyU (== ( 0:: Int)) . mapU (* 2) . enumFromToU 1 $ 1000000<br>
<br>
and by itself runs in a small fraction of a second.  Technically the<br>
start and stop values are specified on the command line, but these are<br>
the values I predominantly used.<br>
<br>
Here are results for some other modes:<br>
<br>
ListLike.map: significantly slower, and runs out of memory (memory<br>
request failed)<br>
ListLike.rigidMap: appears to be the same as using mapU directly<br>
mapReduce:  significantly slower (the 1e6 element test completed after<br>
about an hour), but ran in a very small amount of memory.<br>
<br>
It looks like GHC was able to see through the rigidMap function at<br>
least, but I don&#39;t know if this would still work with the instance<br>
defined in another file.<br>
<br>
Cheers,<br>
<font color="#888888">John<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br></div></div>