
Thanks, Tom, for a nice description of lazy evaluation. Besides the minor things Derek pointed out, there's one more subtle but important thing to correct: At 7:29 AM +0000 11/29/07, Thomas Davie wrote:
$! is the special case, which means strictly apply. It evaluates its argument first, *then* does the application. This may or may not be faster (and usually isn't, due to evaluating more of the argument):
f ($!) x = seq x (f x)
seq is a special function that says "first fully evaluate my first argument, then return my second argument", it breaks non-strict semantics.
seq doesn't fully evaluate its first argument, rather only to what's called "weak head normal form". Roughly, that means only enough to establish the top-level constructor (e.g., to distinguish [] from (_:_)). Dean