Have you spoken to Conal Elliott about this stuff?  He might be interested.  He was looking for doing this sort of thing on iPhones for a bit.<div><br></div><div>Also, I was wondering if you thought this Monad might be useful as a way to automate tasks in an Expect like fashion.  I&#39;ve been struggling with a good way to do this stuff in Haskell for a while.</div>
<div><br></div><div>One challenge is that input is not always line oriented, for example the &quot;Password: &quot; token that we get when we use ssh interactively.  My first thought was to try to avoid seq, and use &quot;words&quot; and &quot;unwords&quot;.</div>
<div><br></div><div>However, I&#39;m thinking now that I&#39;m going to need new Monad Operations like inp, but for different token sizes and possibly different matches of characters.</div><div><br></div><div>Dave</div><div>
<br><div class="gmail_quote">On Wed, Aug 19, 2009 at 8:55 AM, Peter Verswyvelen <span dir="ltr">&lt;<a href="mailto:bugfact@gmail.com">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;">
Not at all, use it for whatever you want to :-)<div><br></div><div>I&#39;m writing this code because I&#39;m preparing to write a bunch of tutorials on FRP, and I first wanted to start with simple console based FRP, e.g. making a little text adventure game, where the input/choices of the user might be parsed ala parsec, using monadic style, applicative style, and arrows, and then doing the same with FRP frameworks like Yampa, Elera, Reactive, etc...</div>

<div><br></div><div>After that I would start writing tutorials that use OpenGL, making some very simple games, again with the above approaches, and ending with a conversion of a very old game of mine (Zarathrusta written in assembler from 1991, which was based on <a href="http://www.bytecellar.com/archives/000106.php" target="_blank">Thrust</a> from 1986, converted by myself in C++ to PocketPC as <a href="http://www.handango.com/catalog/ProductDetails.jsp?productId=16574&amp;platformId=30" target="_blank">G-Pod</a>, and so I would like to make a version in Haskell that runs on the iPhone :-)</div>

<div><br></div><div>This of course is a lot of work, and I would like to put this on the Haskell wiki or a blog or something, so others can contribute and comment. I would like to show real examples that explain the shortcomings of the FRP approaches, because now this is still a bit blurry to me.</div>
<div><div></div><div class="h5">
<div><br></div><div> </div><div><br></div><div><div class="gmail_quote">On Wed, Aug 19, 2009 at 5:43 PM, David Leimbach <span dir="ltr">&lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@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">
This Monad you&#39;ve created is quite excellent.  I was trying to do something like this about a year ago, to make the input and output handling of an interactive bowling score card work nicely.  I kept running into issues, and did not believe that seq was going to do the trick.  Nice work!<div>


<br></div><div>This is a very useful monad I think, it could be called &quot;Prompter&quot; or something to that effect.</div><div><br></div><div>Do you mind if I use it in some of my code?</div><div><br></div><div>Dave<div>

<div></div><div><br>
<br><div class="gmail_quote">On Wed, Aug 19, 2009 at 8:42 AM, 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">


LOL. Maybe we should have that coffee together ;-) at least virtually!<div><div></div><div><div><br><div class="gmail_quote">On Wed, Aug 19, 2009 at 5:39 PM, David Leimbach <span dir="ltr">&lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@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">Argh... I too have been up too late :-).  I edited THE WRONG FILE!  No wonder your change didn&#39;t take effect!  :-/<div>



<br></div><div>Time for coffee I suppose.<div><div></div><div><br><br><div class="gmail_quote">On Wed, Aug 19, 2009 at 8:38 AM, David Leimbach <span dir="ltr">&lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@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">This doesn&#39;t seem to be working for me interactively though on a Mac.  I still get &quot;Welcome&quot; before I&#39;ve entered text.<div>




<div></div><div><br><br><div class="gmail_quote">On Wed, Aug 19, 2009 at 8:25 AM, 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">I fixed it myself but it&#39;s really tricky :-)<div><br></div><div><a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8330" target="_blank">http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8330</a></div>





<div><br></div><div><a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8330" target="_blank"></a>The idea is, that when the input is requested, the output that is then generated must be in sync with the input.</div>






<div><br></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">inp</span> <span style="color:rgb(0, 0, 0);font-weight:bold">=</span> <span style="color:rgb(48, 48, 144);font-weight:bold">S</span> <span style="color:rgb(48, 48, 48)">$</span> <span style="color:rgb(0, 96, 176);font-weight:bold">\</span><span>s</span> <span>i</span> <span style="color:rgb(0, 0, 0);font-weight:bold">-&gt;</span> <span style="color:rgb(0, 128, 0);font-weight:bold">let</span> <span>r</span> <span style="color:rgb(0, 0, 0);font-weight:bold">=</span> <span>(</span><span><b>s</b></span><b> </b><span><b>`</b></span><span style="color:rgb(48, 48, 144)"><b>D</b></span><span style="color:rgb(48, 48, 48)"><b>.</b></span><span><b>append</b></span><span><b>`</b></span><b> </b><span><b>(</b></span><span><b>i</b></span><b> </b><span><b>`</b></span><span><b>seq</b></span><span><b>`</b></span><b> </b><span style="color:rgb(48, 48, 144)"><b>D</b></span><span style="color:rgb(48, 48, 48)"><b>.</b></span><span><b>empty</b></span><span><b>)</b>,</span> <span>head</span> <span>i</span><span>)</span> <span style="color:rgb(0, 128, 0);font-weight:bold">in</span> <span>(</span><span>tail</span> <span>i</span><span>,</span> <span>r</span><span>)</span>
</span></pre><pre style="overflow-x:auto;overflow-y:auto;padding-left:5px"><br></pre><pre style="overflow-x:auto;overflow-y:auto;padding-left:5px"><span style="font-family:arial;font-size:13px;white-space:normal"><div>
I first had</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">inp</span> <span style="color:rgb(0, 0, 0);font-weight:bold">=</span> <span style="color:rgb(48, 48, 144);font-weight:bold">S</span> <span style="color:rgb(48, 48, 48)">$</span> <span style="color:rgb(0, 96, 176);font-weight:bold">\</span><span>s</span> <span>i</span> <span style="color:rgb(0, 0, 0);font-weight:bold">-&gt;</span> <span style="color:rgb(0, 128, 0);font-weight:bold">let</span> <span>r</span> <span style="color:rgb(0, 0, 0);font-weight:bold">=</span> <span>(i `seq` </span><span><b>s</b></span><span>,</span> <span>head</span> <span>i</span><span>)</span> <span style="color:rgb(0, 128, 0);font-weight:bold">in</span> <span>(</span><span>tail</span> <span>i</span><span>,</span> <span>r</span><span>)</span>
</span></pre><div><font face="-webkit-monospace"><span style="white-space:pre"><br></span></font></div><div><span style="white-space:pre"><font face="arial, helvetica, sans-serif">But that was too eager, since i syncs the input not with the output, but with the function that will generate the output.</font></span></div>






<div><span style="white-space:pre"><font face="arial, helvetica, sans-serif"><br></font></span></div><div><span style="white-space:pre"><font face="arial, helvetica, sans-serif">Okay, now I can sleep again :-)</font></span></div>






<div><font face="-webkit-monospace"><span style="white-space:pre"><br></span></font></div></span></div></span></pre><div><font face="-webkit-monospace"><span style="white-space:pre"><br>
</span></font></div></span><div><div></div><div><div><br><div><br><div class="gmail_quote">On Wed, Aug 19, 2009 at 5:12 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">
Thanks, but that doesn&#39;t really matter in my example, my code is just buggy, and I&#39;m not sure why. For example if I change my test function so that it outputs lines only, then it still prints Welcome first before asking for input. <div>







<br></div><div>See e.g. <a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8328" target="_blank">http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8328</a></div><div><div></div><div><div><br></div>
<div>On Wed, Aug 19, 2009 at 5:00 PM, David Leimbach <span dir="ltr">&lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;</span> wrote:</div>
<div><div><div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Try LineBuffering.<div><br></div><div>I do linewise stuff with interact a lot.  You&#39;ll find stuff like</div>







<div><br></div><div>unlines . lines</div><div><br></div><div>may help too.  In fact I just wrote a blog post about this.</div>
<div><br></div><div><a href="http://leimy9.blogspot.com" target="_blank">http://leimy9.blogspot.com</a></div><div><br></div><div>I&#39;m trying to write some interactive code to automate working with serial console controlled power strips, so I need to either use Expect (yuck) or do my own thing.</div>








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







</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div></div><div>
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><div></div><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></div></div>
<br></div></div>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">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>
<br></blockquote></div><br></div>
</blockquote></div><br></div></div></div></div>
</div></div></blockquote></div><br></div></div></div></div></div>
</blockquote></div><br>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>