Non-strict semantics means that a function can have a definite value although its argument is undefined. E.g. in Haskell you get
Prelude> True || undefined True
You will not be able to define a function
or say in C which returns something if you pass an undefined value (e.g. one that is the result of an infinite loop). In fact, in
or(true,infinite_loop()), the code of
or will never be run. In Haskell it is possible because you Call by demand.
- Jonathan Cast in Haskell Cafe about What is the role of $! ?