
On Friday 19 August 2011, 04:22:22, Brandon Allbery wrote:
On Thu, Aug 18, 2011 at 21:21, Michael Serra
wrote: My "superstition" here has been that the former only evaluates pxls' once, whereas the latter computes it twice. This seems like a basic issue which must have been confirmed or debunked somewhere in my readings, but it hasn't sunk in with me.
As I understand it, common subexpression elimination in lazy languages is difficult at best because the shared subexpressions may thereby become ineligible for fusion, so you're expected to do it explicitly by means of where/let clauses. So your superstition is actually the truth.
With a small grain of salt or two. The language allows both, sharing and recomputation, in both cases. But an implementation that did not share if the value is bound to a name in a where/let would grossly violate the users' expectations, so per principle of least surprise you can pretty much rely on sharing in the first case. The latter is harder to predict. In most cases, you'll get recomputation, but GHC does a bit of CSE, so in some cases it will compute only once and share the result (which may be a bad thing - that's a further reason for not doing too much CSE, sometimes sharing has catastrophic results).