On Thu, Sep 8, 2011 at 01:56, Zhi-Qiang Lei <zhiqiang.lei@gmail.com> wrote:
When ('f' : "oo") ++ "bar" becomes 'f' : ("oo" ++ "bar") and then becomes 'f' : ('o' : ("o" ++ "bar")), we still need 'f', don't we?

Haskell lists are singly-linked lists, not arrays or double-linked lists or etc.  Once we've evaluated past a given ":", there is no way to go back to what precedes it; it's no longer reachable (unless the caller, who has been passed the earlier part, is holding onto it) and the garbage collector will reclaim it.

Put slightly differently:  as you've phrased it, evaluation would expand each element but always start stepping into it from the very start.  That's not what happens; as the evaluator steps through the list, it throws away its reference to the earlier part completely.  So it never becomes 'f' : ('o' : ("o" ++ "bar"))) because when the evaluator is at the 'o' it has completely forgotten about the 'f'.  It's got 'o' : ("o" ++ "bar") and any remaining reference (if there is one) to the 'f' is held by something else.

--
brandon s allbery                                      allbery.b@gmail.com
wandering unix systems administrator (available)     (412) 475-9364 vm/sms