
Am Mittwoch, 18. März 2009 16:14 schrieb Will Ness:
Daniel Fischer
writes: Am Mittwoch, 18. März 2009 12:19 schrieb Will Ness:
Bas van Dijk
writes: On Sun, Mar 15, 2009 at 7:35 PM, Will Ness
wrote:
myCycle xs = ys where ys = foldr (:) ys xs
Of course a matter of personal preference, but I tend to prefer where clauses, too, in general. However, my preferred layout is
some code where local declarations
I deeply loathe not having the where on a separate line :-/
Will try not to offend in the future. :)
Very kind of you. But stick to your own style, I can live with loathing the layout of some code :-)
AFAIK,
[let and where versions of myCycle] are compiled to exactly the same code.
since there are no guards there with shared variables, I guess.
No, that doesn't matter. GHC-core has no where, only let, so all where clauses must be rewritten to use let.
What matters is whether you give a name to the result to get it shared or not.
I was hoping GHC is smarter than that in finding shared expressions. Is it what's called deforestation?
Sorry, don't know about that, but I think not, common-subexpression-elimination sounds more like it. But I'm guessing here.
Also, one can imagine this rewrite to be arrived at automagically by a compiler:
sum $ take m $ cycle [1..k]
| n > 0 = x*n+y
where (n,r) = quotRem m k x = sum [1..k] y = sum [1..r]
Any human is certainly capable of seen this almost immediately, presented with the big k's and huge m's. It's automagical. :)
But it's too much of a special case to have a special rule for it in the compiler code. Humans are much less principled and can thus spot a greater variety of patterns (but they are also better in overlooking such patterns).
Cheers,