<div>I&#39;m currently reading the first edition of &quot;Introduction to Functional Programming&quot; by Richard Bird and Philip Wadler. Section 7.6 is on cyclic structures, and has the following example:</div><div><br></div>


<div>  ones = forever 1</div><div>  forever x = x : forever x</div><div><br></div><div>Which, after 5 evaluations, produces a graph like:</div><div><br></div><div>  1 : 1 : 1 : 1 : 1 : forever 1</div><div><br></div><div>

The book then has a re-written version of `forever` that looks like this:</div>
<div><br></div><div>  forever x = zs</div><div>    where zs = x : zs</div><div><br></div><div>Which instead produces a cyclic structure:</div><div><br></div><div>  * 1 : </div><div>  ^-----|</div><div><br></div><div>So it takes up a fixed amount of space, despite being an infinite list.</div>


<div><br></div><div>I was hoping someone could explain the difference between the first and second `forever`s for me. Does the second version become a cyclic graph because the `zs` intermediate expression has no additional arguments so doesn&#39;t need to be reduced further? Or do both end up being optimised the same by GHC? (my newbie attempts to profile show the second takes up a bit less space, but I&#39;m not sure if I&#39;m measuring it right).</div>


<div><br></div><div>Appreciate any help.</div><div>Regards,</div><div>David</div>