On Thu, Aug 28, 2014 at 6:22 AM, Simon Peyton Jones <simo...@microsoft.com> wrote: > 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 _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://www.haskell.org/mailman/listinfo/ghc-devs