
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: which is then just rewritable as:
myCycle xs = ys where ys = foldr (:) ys xs
or (arriving at the same result)
myCycle xs = foldr (:) (myCycle xs) xs
Note that, because 'ys' only has to be calculated once, GHC makes the most efficient code for the former one. In the latter 'myCycle xs' has to be calculated each time 'xs' runs empty.
Actually my point was, that
" I find that "where" rewrites are easier to comprehend for me, more often than not. :) "
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 :-/
" myCycle xs = ys where ys = foldr (:) ys xs "
which should be exactly as the one with the let.
AFAIK, myCycle1 [] = [] myCycle1 xs = let ys = foldr (:) ys xs in ys and myCycle2 [] = [] myCycle2 xs = ys where ys = foldr (:) ys xs are compiled to exactly the same code. In GHC, I think the first thing that happens to myCycle2 is that it's rewritten to myCycle1. What matters if whether you give a name to the result to get it shared or not.