
On 15/12/06, Felix Breuer
1) What precisely is a thunk?
It's a memory cell that says 'I'm an unevaluated value, to evaluate me do X'. For example, consider the differences between the following programs: (common for all that follows) myFunc :: [Int] -> [Int] (1) myFunc xs = ... (2) myFunc (x:xs) = ... (3) myFunc (5:x:[]) = ... (Assume all the pattern matches are successful.) In the RHS of (1), xs refers to a thunk that is the unevaluated list. In (2), you evaluate the first level (to weak head normal form, or whnf) of the list to reveal a cons cell, where the head and tail are both thunks (and can be accessed by x and xs respectively). In (3), you evaluate the first level of the list, revealing a cons cell. You then evaluate the head of this cell, revealing a 5 (so no thunks here; everything's fully evaluated). The tail gets evaluated to a further cons cell where the head is an unevaluated thunk and the tail is evaluated to the empty list (so again, no thunks). Hopefully that gives you some kind of intuition regarding thunks and the implementation of laziness in Haskell. -- -David House, dmhouse@gmail.com