
On Thu, Aug 28, 2014 at 6:22 AM, Simon Peyton Jones
Oh, now I understand. In
loop g = sum . map g $ [1..1000000]
GHC can share [1..100000] across all calls to loop, although that nixes fusion. Because each call of loop may have a different g.
But in
loop' = sum . map (+1) $ [1..1000000]
GHC can share (sum . map (+1) $ [1..1000]) across all calls to loop’, so it can readily fuse the sum, map, and [1..n].
I hope that explains it.
Simon
To my mind, that's a great argument against full laziness. If I wanted to share [1..100000] across all calls to loop, I would surely write either giantList = [1..100000] loop g = sum . map g $ giantList or loop = \g -> sum . map g $ giantList where giantList = [1..100000] If we bump that list up to a few hundred megabytes, the floated version probably just destroyed our cache performance. If we bump it to a few gigabytes—oops, we just ran out of memory. David