
Paul Johnson wrote:
Andrew Coppin wrote:
PS. There is a technical distinction between the terms "lazy" and "non-strict", and also the opposite terms "eger" and "strict". I couldn't tell you what that is.
As I understand it, the distinction is between the mathematical term "non-strict" and the implementation method of "lazy". "Non-strict" means that "reduction" (the mathematical term for evaluation) proceeds from the outside in, so if I have (a+(b*c)) then first you reduce the "+", then you reduce the inner (b*c). Strict languages work the other way around, starting with the innermost brackets and working outwards. [...]
Almost right, but strict and non-strict aren't tied to an operational semantics. In other words, you can talk about _|_ and strictness without knowing how to evaluate your expressions at all. See also http://en.wikibooks.org/wiki/Haskell/Denotational_semantics . For more on the details of lazy evaluation (which actually does work "outside in"), there's the incomplete http://en.wikibooks.org/wiki/Haskell/Graph_reduction . Of course, strict and eager as well as non-strict and lazy have pretty much the same effect and can be used synonymously, but they're different things nonetheless. Regards, apfelmus