On Thu, Mar 31, 2011 at 7:29 AM, Daniel Fischer <daniel.is.fischer@googlemail.com> wrote:
Err, terminology problem here.
Strictly speaking, a function is strict iff

f _|_ = _|_

while we are talking here about evaluation strategies, so we should better
have spoken of eager vs. deferred evaluation.
A non-strict function has different semantics from a strict one by
definition.

If you have a strict function, you may evaluate its argument eagerly
without changing the resultš, while eager evaluation of a non-strict
function's argument may produce _|_ where deferred evaluation wouldn't.

This is almost but not entirely true.  Consider

f x = error "f is not implemented"

Clearly, f _|_ = _|_, so f is strict.

f (error "bang!")

might, depending on how strictness analysis proceeds, generate an "f is not implemented" error or a "bang!" error.  But that's only observable at the IO level, and the optimization is considered important enough, that potentially generating a different exception is allowed.

I think this paper covers some of the details: http://research.microsoft.com/en-us/um/people/simonpj/papers/imprecise-exn.htm

  -- ryan