
Am Mittwoch 16 Dezember 2009 07:22:42 schrieb Gregory Crosswhite:
#3 is true for Haskell, it's just that when your function call appears in two different places, it is counted as two different expressions. Each separate expression will only be evaluated once, though. This is what is really meant, since the alternative --- i.e., no function ever being called more than once for a given set of arguments --- is way too cumbersome to be worth doing in practice for any language.
Laziness really means that if you have, say,
f x = (g 7) + x
then g 7 need only be evaluated at the first call to f, and then after that it can be cached. In some circumstances, if we had
f x = (g 7) + x h x = (g 7) * x
Then maybe the compiler would decide not only to evaluate each (g 7) expression once, but also that the two expression should be merged into references to a single shared expression. However, this is not required for laziness; the only requirement there is that each expression separately only be evaluated once.
And, strictly speaking, Haskell is non-strict, not lazy. Thus, if an implementation decides to evaluate g 7 thrice in f x = (x,x,x) r = f (g 7) it doesn't violate the specs.
Cheers, Greg