<HTML>
<HEAD>
<TITLE>Re: [Haskell-cafe] Multiple State Monads</TITLE>
</HEAD>
<BODY>
<FONT SIZE="4"><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>Inline....<BR>
<BR>
<BR>
On 14/01/2009 01:08, &quot;Luke Palmer&quot; &lt;lrpalmer@gmail.com&gt; wrote:<BR>
<BR>
</SPAN></FONT></FONT><BLOCKQUOTE><FONT SIZE="4"><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>On Tue, Jan 13, 2009 at 5:45 PM, Phil &lt;pbeadling@mail2web.com&gt; wrote: <BR>
</SPAN></FONT></FONT><BLOCKQUOTE><FONT SIZE="4"><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>mcSimulate :: Double -&gt; Double -&gt; Word64 -&gt; [Dou<BR>
ble]<BR>
mcSimulate startStock endTime seedForSeed = fst expiryStock : mcSimulate startStock endTime newSeedForSeed<BR>
<BR>
It is abundantly clear that the startStock and endTime are just being passed around from call to call unchanged &#8211; that is their value is constant throughout the the simulation. &nbsp;For the purposes here when I'm only passing 2 'constants' around it doesn't strike me as too odd, but my list of 'constants' is likely to grow as I bolt more functionality onto this. &nbsp;For readability, I understand that I can create new types to encapsulate complex data types into a single type , but I can't help thinking that passing say 9 or 10 'constants' around and around like this 'feels wrong'. &nbsp;If I sit back and think about it, it doesn't strike me as implausible that the compiler will recognize what I'm doing and optimize this out for me, and what I'm doing is thinking about the whole think like a C++ programmer (which I traditionally am) would. &nbsp;<BR>
</SPAN></FONT></FONT></BLOCKQUOTE><FONT SIZE="4"><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'><BR>
You can factor out constants in a couple ways. &nbsp;If you are just passing constants between a recursive call to the same function, you can factor out the recursive bit into a separate function:<BR>
<BR>
</SPAN></FONT><SPAN STYLE='font-size:11pt'><FONT FACE="Courier New">something param1 param2 = go<BR>
&nbsp;&nbsp;&nbsp;&nbsp;where<BR>
&nbsp;&nbsp;&nbsp;&nbsp;go = ... param1 ... param2 ... etc ... go ... <BR>
&nbsp;&nbsp;&nbsp;&nbsp;etc = ...<BR>
</FONT><FONT FACE="Calibri, Verdana, Helvetica, Arial"><BR>
Where go takes only the parameters that change, and the rest is handled by its enclosing scope. &nbsp;You might buy a little performance this way too, depending on the compiler's cleverness (I'm not sure how it optimizes these things).<BR>
<BR>
<BR>
[PHIL]<BR>
Firstly &#8211; thanks for your advice.<BR>
<BR>
When I say constants, I should be clear &#8211; these are parameters passed in by the user, but they remain constant throughout the recursive call. &nbsp;I think the example above is only relevant if they are constants at compile time? &nbsp;If not I&#8217;m not sure I follow the example. &nbsp;If we have something like<BR>
<BR>
</FONT></SPAN><FONT COLOR="#00007F"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>mcSimulate :: Double -&gt; Double -&gt; Word64 -&gt; [Double]<BR>
mcSimulate startStock endTime seedForSeed = fst expiryStock : mcSimulate</SPAN></FONT></FONT></FONT><FONT SIZE="5"><FONT FACE="Times New Roman"><SPAN STYLE='font-size:12pt'> </SPAN></FONT></FONT><FONT COLOR="#00007F"><FONT SIZE="4"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>startStock endTime newSeedForSeed<BR>
</SPAN></FONT></FONT></FONT><FONT SIZE="5"><FONT FACE="Times New Roman"><SPAN STYLE='font-size:12pt'> &nbsp;</SPAN></FONT></FONT><FONT COLOR="#00007F"><FONT SIZE="4"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>where<BR>
</SPAN></FONT></FONT></FONT><FONT SIZE="5"><FONT FACE="Times New Roman"><SPAN STYLE='font-size:12pt'> &nbsp;&nbsp;&nbsp;</SPAN></FONT></FONT><FONT COLOR="#00007F"><FONT SIZE="4"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>expiryStock = iterate evolveUnderlying (startStock, ranq1Init seedForSeed) !! truncate (endTime/timeStep)<BR>
</SPAN></FONT></FONT></FONT><FONT SIZE="5"><FONT FACE="Times New Roman"><SPAN STYLE='font-size:12pt'> &nbsp;&nbsp;&nbsp;</SPAN></FONT></FONT><FONT COLOR="#00007F"><FONT SIZE="4"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>newSeedForSeed = seedForSeed + 246524<BR>
<BR>
</SPAN></FONT></FONT></FONT><FONT SIZE="4"><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>Here startStock and endTime are not altered from iteration to iteration, but they are not known at compile time. &nbsp;I see that I can reduce this to something like<BR>
<BR>
</SPAN></FONT><FONT COLOR="#00007F"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>test seedForSeed = fst expiryStock : test newSeedForSeed<BR>
&nbsp;&nbsp;where<BR>
</SPAN></FONT></FONT></FONT><FONT SIZE="5"><FONT FACE="Times New Roman"><SPAN STYLE='font-size:12pt'> &nbsp;&nbsp;&nbsp;</SPAN></FONT></FONT><FONT COLOR="#00007F"><FONT SIZE="4"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>expiryStock = iterate evolveUnderlying (_startStock, ranq1Init seedForSeed) !! truncate (_endTime/timeStep)<BR>
</SPAN></FONT></FONT></FONT><FONT SIZE="5"><FONT FACE="Times New Roman"><SPAN STYLE='font-size:12pt'> &nbsp;&nbsp;&nbsp;</SPAN></FONT></FONT><FONT COLOR="#00007F"><FONT SIZE="4"><FONT FACE="Arial"><SPAN STYLE='font-size:10pt'>newSeedForSeed = seedForSeed + 246524<BR>
<BR>
</SPAN></FONT></FONT></FONT><FONT SIZE="4"><FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>But don&#8217;t understand how I &#8216;feed&#8217; the _startStock and _endTime in?<BR>
<BR>
Could you explain this in detail, or confirm my suspicions that it only works for compile-time constants?<BR>
<BR>
<BR>
Thanks again,<BR>
<BR>
Phil.</SPAN></FONT></FONT></BLOCKQUOTE>
</BODY>
</HTML>