Questions prompted by the "Excessive Sharing" section, page 405, of SPJ's "The Implementation of Functional Programming".

This section gives 2 variations of a power list function, semantically equivalent, but with different space behaviours. Paraphrasing, given a caller of "length (powerListXXX [1..20])", the powerListBad version gobbles more and more space as execution proceeds, whilst the powerListGood version runs in a small amount of constant space. Confirmed under GHC 6.2.2 with -O2.

powerListBad [] = [[]]
powerListBad (x:xs) = pxs ++ map ((:) x) pxs
   where (x:xs) pxs = powerListBad xs

powerListGood [] = [[]]
powerListGood (x:xs) = powerListGood xs ++ map ((:) x) (powerLIstGood xs)

Clearly, in this instance GHC is not transforming either of these definitions into the other. But are there other compile time transformations performed by GHC that might result in more (excessive) sharing, in particular the creation of new common sub-expressions such as pxs? If not, is that a deliberate design decision?

Since I guess the "excessive" bit of excessive sharing probably can't be determined until run-time, would it be practical for the run-time system to do something about it? For example, once the run-time system notices that the graph size has breached a certain threshold it begins to decouple references to "reduced" but bulky sections of the graph, forcing them to be recomputed (from the original expression) at a later time.

_________________________________________________________________
Is your PC infected? Get a FREE online computer virus scan from McAfee® Security. http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963

_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to