Apparently this particular example happens to work on Mac and Linux because of different buffering (thanks Martijn for the help!)<div><div><br></div><div>To make sure we have no buffering at all, the main function should be:</div>
<div><span style="font-family:-webkit-sans-serif;font-size:14px"><pre style="overflow-x:auto;overflow-y:auto;padding-left:5px"><span><span style="color:rgb(0, 96, 176);font-weight:bold">main</span> <span style="color:rgb(0, 0, 0);font-weight:bold">=</span> <span style="color:rgb(0, 128, 0);font-weight:bold">do</span>
</span><span>  <span>hSetBuffering</span> <span>stdout</span> <span style="color:rgb(48, 48, 144);font-weight:bold">NoBuffering</span>
</span><span>  <span>hSetBuffering</span> <span>stdin</span> <span style="color:rgb(48, 48, 144);font-weight:bold">NoBuffering</span>
</span><span>  <span>test</span></span></pre></span>Now I think it should also be <b>incorrect</b> on Unix systems.</div><div><br></div><div>I guess the way I&#39;m concatenating the strings is not correct, not sure.</div>
<div><br></div><div>I would like to use a graphical tool to show the graph reduction step by step, to get a better understanding of the laziness &amp; strictness. Does such a tool exist? I know people often say this is not usable because the amount of information is too much, but I used to be an assembly language programmer so I still would like to give it a try :-)</div>

<div><br></div><div><br></div><div><br></div><div><div class="gmail_quote">On Wed, Aug 19, 2009 at 1:07 PM, Peter Verswyvelen <span dir="ltr">&lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In an attempt to get a deeper understanding of several monads (State, ST, IO, ...) I skimmed over some of the research papers (but didn&#39;t understand all of it, I lack the required education) and decided to write a little program myself without using any prefab monad instances that should mimic the following:<div>


<br></div><div><div><font face="&#39;courier new&#39;, monospace"><span style="font-size:large">main = do</span></font></div><div><font face="&#39;courier new&#39;, monospace"><span style="font-size:large">  putStrLn &quot;Enter your name:&quot;</span></font></div>


<div><font face="&#39;courier new&#39;, monospace"><span style="font-size:large">  x &lt;- getLine</span></font></div><div><font face="&#39;courier new&#39;, monospace"><span style="font-size:large">  putStr &quot;Welcome &quot;</span></font></div>


<div><font face="&#39;courier new&#39;, monospace"><span style="font-size:large">  putStrLn x</span></font></div><div><font face="&#39;courier new&#39;, monospace"><span style="font-size:large">  putStrLn &quot;Goodbye!&quot;</span></font></div>


<div><div><font face="&#39;courier new&#39;" size="4"><span style="font-size:16px"><br></span></font></div><div><font face="&#39;courier new&#39;" size="4"><span style="font-size:16px"><span style="font-family:arial;font-size:13px">But instead of using IO, I wanted to make my own pure monad that gets evaluated with interact, and does the same.</span></span></font></div>


<div><br></div><div>However, I get the following output:</div><div><br></div><div>Enter your name:</div><div>Welcome ......</div><div><br></div><div>So the Welcome is printed too soon.</div><div><br></div><div>This is obvious since my monad is lazy, so I tried to put a seq at some strategic places to get the same behavior as IO. But I completely failed doing so, either the program doesn&#39;t print anything and asks input first, or it still prints too much output.</div>


<div><br></div><div>Of course I could just use ST, State, transformers, etc, but this is purely an exercise I&#39;m doing.</div><div><br></div><div>So, I could re-read all papers and look in detail at all the code, but maybe someone could help me out where to put the seq or what to do :-)</div>


<div><br></div><div>The code is at <a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316" target="_blank">http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316</a></div><div><br></div><div>Oh btw, the usage of DList here might not be needed; intuitively it felt like the correct thing to do, but when it comes to Haskell, my intuition is usually wrong ;-)</div>


<div><br></div><div>Thanks a lot,</div><div>Peter Verswyvelen</div><div><br></div></div></div>
</blockquote></div><br></div>
</div>