Jan-Willem Maessen wrote:
On Apr 12, 2007, at 9:39 PM, Matthew Brecknell wrote:
Jan-Willem Maessen:
Interestingly, in this particular case what we obtain is isomorphic
to constructing and reversing a list.
Jan-Willem's observation also hints at some interesting performance
characteristics of difference lists. It's well known that difference
lists give O(1) concatenation, but I haven't seen much discussion of the
cost of conversion to ordinary lists.
Nice analysis, thanks to both of you. I think a lot of this folklore
isn't widely understood, particularly the fact that the closures
constructed by difference lists are isomorphic to trees, with nodes
corresponding to append/compose and leaves corresponding to
empty/singleton.
So you pay the cost for append each time you flatten---the difference
list trick is only a win if you flatten to an ordinary list once and/or
consume the entire list each time you flatten it. I'd had an intuitive
notion of how this worked, but this spells it out nicely.
Of course, once you represent things like so:
data DiffList a = Segment [a]
| DiffList a :++ DiffList a
toList :: DiffList a -> [a]
toList dl = toListApp dl []
toListApp :: DiffList a -> [a] -> [a]
toListApp (Segment s) = (s++)
toListApp (a:++b) = toListApp a . toListApp b
You can start thinking about all sorts of other interesting questions,
beyond just transforming to a list and eta-abstracting toListApp. The
next thing you know, you're writing a better pretty printer or otherwise
mucking about with the DiffList type itself to tailor it for your own
nefarious purposes.
-Jan
------------------------------------------------------------------------
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe
And the relationship between them is de-/re-functionalization,
"Defunctionalization at Work" (http://www.brics.dk/RS/01/23/) has some
interesting applications of ideas along the line of Jan's.
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe