<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:D="DAV:" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.gmailquote
        {mso-style-name:gmail_quote;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>John, <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Your change makes just the server function to return the same
number that it receives. My server implementation multiplied the incoming number
by two. <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>My question was why does the output from writer shows first all output
from server, then followed by all output from client.&nbsp; I would like to see
output from client and server to alternate in the order in which the
computation occurs, namely [server, client, server, client, server, client, &#8230;].
<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>I know that for finite sequences, it is easily possible to reorder
the output from writer. However, it is not possible to reorder the output if
the sequence is infinite.&nbsp; That can be seen in my example program if it is
modified by removing the statement &#8220;take 10&#8221;. In that case the
program never prints output from clients, the output printer will be only from
the server. <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Jan<a name="_MailEndCompose"><o:p></o:p></a></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> John Vogel
[mailto:jpvogel1@gmail.com] <br>
<b>Sent:</b> Monday, January 14, 2008 8:33 PM<br>
<b>To:</b> Jan Stranik<br>
<b>Cc:</b> haskell@haskell.org<br>
<b>Subject:</b> Re: [Haskell] Simulating client server communication with
recursive monads<o:p></o:p></span></p>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal style='margin-bottom:12.0pt'>If you redefine as follows:<br>
<br>
server :: [Integer] -&gt; Writer [String] [Integer]<br>
server [] = return []<br>
server (a:as) = do<br>
tell [&quot;Server &quot; ++ show a]<br>
rs &lt;- server as<br>
return (a:rs)<br>
<br>
You get this for the output:<br>
<br>
<br>
[&quot;Server 0&quot;,&quot;Server 1&quot;,&quot;Server 2&quot;,&quot;Server
3&quot;,&quot;Server 4&quot;,&quot;Server 5&quot;,&quot;Server
6&quot;,&quot;Server 7&quot;,&quot;Server 8&quot;,&quot;Server
9&quot;,&quot;Server 1 <br>
0&quot;,&quot;Client 0&quot;,&quot;Client 1&quot;,&quot;Client
2&quot;,&quot;Client 3&quot;,&quot;Client 4&quot;,&quot;Client
5&quot;,&quot;Client 6&quot;,&quot;Client 7&quot;,&quot;Client
8&quot;,&quot;Client 9&quot;] <br>
<br>
Then you just need to alternate the pattern. &nbsp;Though a real simulation
of&nbsp;sever&nbsp;traffic
would&nbsp;account&nbsp;for&nbsp;the&nbsp;packets&nbsp;<br>
not&nbsp;being&nbsp;recieved, rerequested, or recieved out of order. &nbsp;It
also depends whether you are simulating TCP or UDP. <o:p></o:p></p>

<div>

<p class=MsoNormal><span class=gmailquote>On 1/14/08, <b>Jan Stranik</b> &lt;<a
href="mailto:janstranik@yahoo.de">janstranik@yahoo.de</a>&gt; wrote:</span><o:p></o:p></p>

<div>

<div>

<p>Hello,<o:p></o:p></p>

<p>I am trying to simulate a client server traffic using recursive lazy
evaluation. I am trying to do that in a recursive writer monad. <o:p></o:p></p>

<p>Following code is my attempt to simulate client server interaction and
collect its transcript: <o:p></o:p></p>

<p style='margin-left:.5in'>{-# OPTIONS -fglasgow-exts #-}<o:p></o:p></p>

<p style='margin-left:.5in'>module Main where<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;<o:p></o:p></p>

<p style='margin-left:.5in'>import Control.Monad.Writer.Lazy<o:p></o:p></p>

<p style='margin-left:.5in'>simulation:: Writer [String] ()<o:p></o:p></p>

<p style='margin-left:.5in'>simulation = mdo<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a &lt;-
server cr<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cr &lt;-
client $ take 10 a <o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
()<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;<o:p></o:p></p>

<p style='margin-left:.5in'>server:: [Integer] -&gt; Writer [String] [Integer]<o:p></o:p></p>

<p style='margin-left:.5in'>server (a:as) = do <o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp; tell [&quot;server &quot; ++ show a]<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp; rs &lt;- server as<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp; return ((a*2):rs)<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;<o:p></o:p></p>

<p style='margin-left:.5in'>server [] = return []<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;<o:p></o:p></p>

<p style='margin-left:.5in'>client:: [Integer] -&gt; Writer [String] [Integer]<o:p></o:p></p>

<p style='margin-left:.5in'>client as = do <o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp; dc &lt;- doClient as<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp; return (0:dc)<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp; where <o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doClient (a:as) = do<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
tell [&quot;Client &quot; ++ show a]<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
as' &lt;- doClient as<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return ((a+1):as')<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doClient [] = return
[]<o:p></o:p></p>

<p style='margin-left:.5in'>&nbsp;<o:p></o:p></p>

<p style='margin-left:.5in'>main = return $ snd $ runWriter simulation<o:p></o:p></p>

<p>&nbsp;<o:p></o:p></p>

<p>The problem that I see is that the transcript collected contains first all
output from the server, and then output from the client. <o:p></o:p></p>

<p>Here is an example of output that I see: <o:p></o:p></p>

<p>:[&quot;server 0&quot;,&quot;server 1&quot;,&quot;server
3&quot;,&quot;server 7&quot;,&quot;server 15&quot;,&quot;server
31&quot;,&quot;server 63&quot;,&quot;server 127&quot;,&quot;server
255&quot;,&quot;server 511&quot;,&quot;server 1023&quot;,&quot;Client
0&quot;,&quot;Client 2&quot;,&quot;Client 6&quot;,&quot;Client
14&quot;,&quot;Client 30&quot;,&quot;Client 62&quot;,&quot;Client
126&quot;,&quot;Client 254&quot;,&quot;Client 510&quot;,&quot;Client
1022&quot;] <o:p></o:p></p>

<p>&nbsp;<o:p></o:p></p>

<p>I would like to collect the output like:<o:p></o:p></p>

<p>:[&quot;client 0&quot;,&quot;server 0&quot;, &quot;client 1&quot;,&#8230;]<o:p></o:p></p>

<p>&nbsp;<o:p></o:p></p>

<p>This would allow me to remove the ending condition in simulation (take 10),
and instead rely fully on lazy evaluation to collect as many simulation steps
as needed by my computation. &nbsp; <o:p></o:p></p>

<p>I am still relatively new to the concepts of recursive monadic computations,
so I would appreciate any suggestions from experts on this mailing list. <o:p></o:p></p>

<p>&nbsp;<o:p></o:p></p>

<p>Thank you<o:p></o:p></p>

<p>&nbsp;<o:p></o:p></p>

<p>Jan<o:p></o:p></p>

<p>&nbsp;<o:p></o:p></p>

</div>

</div>

<p class=MsoNormal style='margin-bottom:12.0pt'><br>
_______________________________________________<br>
Haskell mailing list<br>
<a href="mailto:Haskell@haskell.org">Haskell@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell" target="_blank">http://www.haskell.org/mailman/listinfo/haskell</a><o:p></o:p></p>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</body>

</html>