Exercises |
---|
f x = length [head x] g x = length (tail x) |
- Because
show x
needs to evaluatex
to convert it to aString
. 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).