On Thu, Jan 8, 2009 at 12:56 PM, Phil <span dir="ltr">&lt;<a href="mailto:pbeadling@mail2web.com">pbeadling@mail2web.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
One more question on this - the other concern I had with the recursive list<br>
approach was that although lazy evaluation prevents me generating numbers<br>
before I &#39;ask&#39; for them, I figured that if I was going to be asking for say<br>
10 million over the course of one simulation, that although I request them<br>
one by one, over hours or even days, at the end of the simulation I will<br>
still have a list of 10 million word64s - each of which I could throw away<br>
within minutes of asking for it. &nbsp;This seemed like huge memory bloat, and<br>
thus probably I was taking the wrong approach.</blockquote><div><br>if you don&#39;t hold on to the whole list, i.e. you use the head of the list and then pass the tail around, the garbage collector will collect the unused prefix.<br>
<br>In Haskell lists are used like loops.&nbsp; If a list is used in a sufficiently forgetful fashion, it will use constant space.<br><br>Luke<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
I&#39;d be interested to know if you have any thoughts on the various solutions?<br>
Ryan&#39;s randomComputation strikes me as the most practical and there&#39;s an old<br>
adage that if a language provides a facility (i.e. The State Monad here),<br>
you shouldn&#39;t be rewriting similar functionality yourself unless there is a<br>
very very good reason to go it alone. &nbsp;Thus I figure that Haskell&#39;s State<br>
Monad used as described is always going to beat anything I come up with to<br>
do the same thing - unless I spend an awful lot of time tailoring a specific<br>
solution.<br>
<br>
If you think there is a nicer non-Monadic, pure solution to this type of<br>
problem, I&#39;d be interested to hear them.<br>
<br>
Thanks again for all your help,<br>
<font color="#888888"><br>
Phil.<br>
</font><div><div></div><div class="Wj3C7c"><br>
<br>
<br>
On 08/01/2009 13:27, &quot;Kurt Hutchinson&quot; &lt;<a href="mailto:kelanslists@gmail.com">kelanslists@gmail.com</a>&gt; wrote:<br>
<br>
&gt; Ryan gave some great advice about restructuring your program to do<br>
&gt; what you want, but I wanted to give a small explanation of why that&#39;s<br>
&gt; necessary.<br>
&gt;<br>
&gt; 2009/1/7 Phil &lt;<a href="mailto:pbeadling@mail2web.com">pbeadling@mail2web.com</a>&gt;:<br>
&gt;&gt; &nbsp;I want to be able to do:<br>
&gt;&gt;<br>
&gt;&gt; Get_a_random_number<br>
&gt;&gt;<br>
&gt;&gt; &lt; a whole load of other stuff &gt;<br>
&gt;&gt;<br>
&gt;&gt; Get the next number as defined by the updated state in the first call<br>
&gt;&gt;<br>
&gt;&gt; &lt;some more stuff&gt;<br>
&gt;&gt;<br>
&gt;&gt; Get another number, and so on.<br>
&gt;<br>
&gt; The issue you&#39;re having is that you&#39;re trying to do the &quot;other stuff&quot;<br>
&gt; in your &#39;main&#39;, but main isn&#39;t inside the State monad. The only State<br>
&gt; computation you&#39;re calling from main is getRanq1, but you really need<br>
&gt; another State computation that does &quot;other stuff&quot; and calls getRanq1<br>
&gt; itself. That&#39;s what Ryan&#39;s first suggestion implements. You need all<br>
&gt; your &quot;other stuff&quot; to be done inside the State monad so that it has<br>
&gt; read/update access to the current random state. So all your main does<br>
&gt; is run a State computation. That computation calls getRanq1 itself and<br>
&gt; then &quot;other stuff&quot; in between calls to getRanq1.<br>
&gt;<br>
&gt; Does that make sense?<br>
&gt;<br>
&gt; Kurt<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>