[Haskell-beginners] Question about lazy evaluation
Brandon Allbery
allbery.b at gmail.com
Fri Sep 9 00:09:33 CEST 2011
On Thu, Sep 8, 2011 at 01:56, Zhi-Qiang Lei <zhiqiang.lei at 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 at gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20110908/154bea20/attachment.htm>
More information about the Beginners
mailing list