
OK, in f, *length* already knows it's argument is a list. In g, *length* doesn't know what's inside the parens, extra evaluation there. So g is already ahead before we get to what's inside the [] and (). But since both still have eval x to *thunk* : *thunk*, g evaluates "to a deeper level?" Michael
Wouldn't both functions need to evaluate x to the same level, *thunk* : *thunk* to insure listhood?
f x = length [head *thunk* : *thunk*] g x = length (tail *thunk* : *thunk*)
Michael
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Notice the two different kinds of brackets being used in f versus g :)
--- On Sat, 7/31/10, Ben Millwood
From: http://en.wikibooks.org/wiki/Haskell/Laziness
Given two functions of one parameter, f and g, we say f is stricter than g if f x evaluates x to a deeper level than g x
Exercises
1. Which is the stricter function?
f x = length [head x] g x = length (tail x)
Prelude> let f x = length [head x] Prelude> let g x = length (tail x) Prelude> f undefined 1 Prelude> g undefined *** Exception: Prelude.undefined Prelude>
So, g is stricter than f?
Wouldn't both functions need to evaluate x to the same level, *thunk* : *thunk* to insure listhood?
f x = length [head *thunk* : *thunk*] g x = length (tail *thunk* : *thunk*)
Michael
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
Notice the two different kinds of brackets being used in f versus g :)