← Back to Laziness

  1. Why must we fully evaluate x to normal form in f x y = show x?
  2. Which is the stricter function?
f x = length [head x]
g x = length (tail x)
  1. Because show x needs to evaluate x to convert it to a String.
  2. g is stricter: it must walk through the whole list to discover its length, even if it does not need to examine the single values.

Instead, to evaluate length [head x], when length evaluates the passed list it obtains thunk_0:[], where thunk_0 represents the result of head x. Thus, you can verify that f undefined => 1 (actually, f is equivalent to const 1) while g undefined fails. Also note that, if ls is a valid Int list (which does not contain undefined among its elements), all following expressions fail to evaluate:

g (1:undefined) => length undefined => undefined

whereas the following evaluate successfully:

g (1:undefined:ls) => length (undefined:ls) => 1 + length ls
g (undefined:ls) => length ls

The difference between g (1:undefined) and g (1:undefined:ls)may appear confusing, but is correct, because in the first case undefined replaces a list (in particular, the tail of the cons cell passed to g), while in the second case undefined replaces a list value (which is not needed).