
On Thu, Sep 8, 2011 at 01:56, Zhi-Qiang Lei
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