Thomas Davie wrote:
On 9 Jul 2009, at 14:55, Cristiano Paris wrote:
I'm wondering what a good example of why laziness enhances
composability would be.
I'm specifically looking for something that can't implemented in
Python with iterators (at least not elegantly), but can actually be
implemented in Haskell.
Pretty much anything that uses "tying the knot" is very difficult to
implement in a non-lazy language without a lot of indirection.
I disagree; mutation can work rather well instead.
One application I work on has to parse input containing items with
forward and backward references using keys into a graph of objects, a
classic tying-the-knot problem. However, we are not using a lazy
language, so have only one procedure to create or look up the object
corresponding to an item, by key. Parsing references to an item will
just store the returned address, but parsing the definition of an item
will mutate the object to fill in the data. The effect is that all the
references end up as pointers to the right objects, and the objects for
undefined items end up keeping their default values (caught by later
checks).
Situations like that make either mutation or laziness very handy, and if
one cannot imagine the "tying the knot" technique then mutation looks
like the only good way. No wonder people don't "get" pure FP! ;-)
--
src/
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe