I think it can be called "lazy-list" because it behave like a list. However it is often called "stream" because the internal structure may really differ from a list (like in your example). There is a section in SICP about streams (
<a href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5">http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5</a>).<br><br>For other erlang related code, there is an implementation in user contribution of trapexit, and I wrote a very simple one too 
<a href="http://khigia.wordpress.com/2007/05/07/44/">http://khigia.wordpress.com/2007/05/07/44/</a> (the end contains few links which could interest you).<br><br>Hope this help.<br><br><div><span class="gmail_quote">On 8/21/07, 
<b class="gmail_sendername">David Mercer</b> <<a href="mailto:dmercer@gmail.com">dmercer@gmail.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">









<div link="blue" vlink="purple" lang="EN-US">

<div>

<p>OK, so I want to generate a sequence based on some
mathematical formula.  For instance, [1, 2, 3, 4, 5, ] or [1, 2, 4,
8, 16, ].  Since these are infinite, I cannot implement them as
lists.  Instead, I implement them as a function:</p>

<p> </p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">2>
% <b><span style="color: red;">[1, 2, 3, 4, 5, ...]</span></b></span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">2>
F0a = FF(fun(X) -> <b><span style="color: red;">X + 1</span></b> end, 1).</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">#Fun<erl_eval.20.112921583></span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">3>
{_, F1a} = F0a().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">1</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">4>
{_, F2a} = F1a().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">2</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">5>
{_, F3a} = F2a().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">3</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">6>
{_, F4a} = F3a().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">4</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">7>
{_, F5a} = F4a().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">5</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">12>
% <b><span style="color: red;">[1, 2, 4, 8, 16, ...]</span></b></span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">12>
F0b = FF(fun(X) -> <b><span style="color: red;">2 * X</span></b> end, 1).</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">#Fun<erl_eval.20.112921583></span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">13>
{_, F1b} =
F0b().               
</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">1</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">14>
{_, F2b} = F1b().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">2</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">15>
{_, F3b} = F2b().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">4</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">16>
{_, F4b} = F3b().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">8</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">17>
{_, F5b} = F4b().</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">{<b><span style="color: red;">16</span></b>,#Fun<erl_eval.20.112921583>}</span></p>

<p> </p>

<p>I am sure many of you have done this before, and I haven't
discovered anything new, but I wanted to figure it out for myself, so I
did.  The function I came up with was:</p>

<p> </p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">FF
= fun(F, X0) -></span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;"> 
G = fun(F, X0, G) -></span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">   
{ X0, fun() -> G(F, F(X0), G) end }</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;"> 
end,</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;"> 
fun() -> G(F, X0, G) end</span></p>

<p style="margin-left: 0.5in;"><span style="font-family: Consolas;">end.</span></p>

<p> </p>

<p style="margin-left: 0.25in; text-indent: -0.25in;">1.<span>       </span>Is
this the way you'd have done this?</p>

<p> </p>

<p style="margin-left: 0.25in; text-indent: -0.25in;">2.<span>       </span>Is
there a name for this pattern?  I was calling it a continuation in my
mind, because the second element of the output 2-tuple is a continuation
function to give the next value, but I thought maybe there is a more specific
name for this use of continuations.</p>

<p> </p>

<p>Cheers,</p>

<p> </p>

<p>David</p>

</div>

</div>


<br>_______________________________________________<br>erlang-questions mailing list<br><a onclick="return top.js.OpenExtLink(window,event,this)" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote></div><br>