Hmmm very interesting thinking on this.  Perhaps ByteStrings would be a good way to go for efficiency of composition.<div><br></div><div>I&#39;d love to see some profiling of all of this as part of the lesson at some point.  (Perhaps with vacuum visualization?)</div>
<div><br></div><div>This thread has tackled 3 major tricky issue areas with Haskell so far:</div><div><br></div><div>1. Lazy IO and seq</div><div>2. Roll-your-own-Monad</div><div>3. Data growth profiling.</div><div><br></div>
<div>It&#39;s been a good read anyway, and fun to play with the code.</div><div><br></div><div>Dave</div><div><br></div><div><div class="gmail_quote">On Wed, Aug 19, 2009 at 1:00 PM, 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;">Wow, very nice cleanup! That&#39;s really a good way for me to learn, thanks.<div><div><div><div><div><div><br></div><div>
Well, my intuition told me that strings and ++ wouldn&#39;t work, since what we want is an infinite list of output strings, and using ++ would result in (((s1++s2)++s3)++s4)++s5... which is highly inefficient and I think it would keep the complete output text in memory. Using difference lists results in right associative concatenation of s1++(s2++(s3++(s4++... which is efficient and can be garbage collected nicely. At least that&#39;s what I guess. I really would like to get a deeper understanding of all this but that will take lots of time and study, but if I&#39;m lucky I still have 20 to 40 years to go, so I won&#39;t be bored :-)</div>
<div><div></div><div class="h5">
<div><br></div><div><br></div><div><br></div><div><br></div><div><div class="gmail_quote">On Wed, Aug 19, 2009 at 9:46 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">Very cool!<div><br></div><div>I am still wondering what the significance of the DList is with this though, or why it was needed to begin with.</div>

<div><br></div><div>Dave<div><div></div><div><br><br><div class="gmail_quote">On Wed, Aug 19, 2009 at 12:28 PM, Ryan Ingram <span dir="ltr">&lt;<a href="mailto:ryani.spam@gmail.com" target="_blank">ryani.spam@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">Added a new version (tested, works with infinite loops, no early output, etc.)<br>
<br>
<a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8343" target="_blank">http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8343</a><br>
<br>
I&#39;ll put up a short write-up after lunch.<br>
<font color="#888888"><br>
  -- ryan<br>
</font><div><div></div><div><br>
On Wed, Aug 19, 2009 at 11:28 AM, Peter Verswyvelen&lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt; wrote:<br>
&gt; The cleaned up code didn&#39;t seem to work for me, it printed everything before<br>
&gt; asking input again.<br>
&gt; But I added a patch that looks like it supports looping, but I don&#39;t<br>
&gt; understand exactly what is going on :-)<br>
&gt; I added the &quot;delay&quot; function which makes appending to the output less<br>
&gt; strict.<br>
&gt; Note that in this version I add a delay to each right argument of &gt;&gt;=, but<br>
&gt; one could also do it manually<br>
&gt; On Wed, Aug 19, 2009 at 7:37 PM, David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; I&#39;ve corrected it.  It still doesn&#39;t suffer looping.  :-)<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Aug 19, 2009 at 10:31 AM, David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Doesn&#39;t seem to compile.<br>
&gt;&gt;&gt; I nearly never use case statements in my code, so I&#39;m not really sure<br>
&gt;&gt;&gt; what&#39;s going on.<br>
&gt;&gt;&gt; neat2.hs:14:39: parse error on input `=&#39;<br>
&gt;&gt;&gt; Dave<br>
&gt;&gt;&gt; On Wed, Aug 19, 2009 at 10:23 AM, Ryan Ingram &lt;<a href="mailto:ryani.spam@gmail.com" target="_blank">ryani.spam@gmail.com</a>&gt;<br>
&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; I posted a reply to your paste with a stricter version of S and some<br>
&gt;&gt;&gt;&gt; cleanup.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Untested, though I believe it should work without &quot;seq&quot;.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &quot;case&quot; provides all the strictness you need, I think!<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;  -- ryan<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 9:28 AM, Peter Verswyvelen&lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt; Expect more bugs with this though :-) Just found out that looping does<br>
&gt;&gt;&gt;&gt; &gt; not<br>
&gt;&gt;&gt;&gt; &gt; work, it hangs, e.g.<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; test = do<br>
&gt;&gt;&gt;&gt; &gt;   out &quot;Enter your first name:&quot;<br>
&gt;&gt;&gt;&gt; &gt;   fstName &lt;- inp<br>
&gt;&gt;&gt;&gt; &gt;   out &quot;Enter your second name:&quot;<br>
&gt;&gt;&gt;&gt; &gt;   sndName &lt;- inp<br>
&gt;&gt;&gt;&gt; &gt;   out (&quot;Welcome &quot;++fstName++&quot; &quot;++sndName)<br>
&gt;&gt;&gt;&gt; &gt;   out &quot;Goodbye!&quot;<br>
&gt;&gt;&gt;&gt; &gt;   test<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; Doesn&#39;t seem to work :-) Back to the drawing board.<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; On Wed, Aug 19, 2009 at 5:55 PM, Peter Verswyvelen &lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; &gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt; Not at all, use it for whatever you want to :-)<br>
&gt;&gt;&gt;&gt; &gt;&gt; I&#39;m writing this code because I&#39;m preparing to write a bunch of<br>
&gt;&gt;&gt;&gt; &gt;&gt; tutorials<br>
&gt;&gt;&gt;&gt; &gt;&gt; on FRP, and I first wanted to start with simple console based FRP,<br>
&gt;&gt;&gt;&gt; &gt;&gt; e.g.<br>
&gt;&gt;&gt;&gt; &gt;&gt; making a little text adventure game, where the input/choices of the<br>
&gt;&gt;&gt;&gt; &gt;&gt; user<br>
&gt;&gt;&gt;&gt; &gt;&gt; might be parsed ala parsec, using monadic style, applicative style,<br>
&gt;&gt;&gt;&gt; &gt;&gt; and<br>
&gt;&gt;&gt;&gt; &gt;&gt; arrows, and then doing the same with FRP frameworks like Yampa,<br>
&gt;&gt;&gt;&gt; &gt;&gt; Elera,<br>
&gt;&gt;&gt;&gt; &gt;&gt; Reactive, etc...<br>
&gt;&gt;&gt;&gt; &gt;&gt; After that I would start writing tutorials that use OpenGL, making<br>
&gt;&gt;&gt;&gt; &gt;&gt; some<br>
&gt;&gt;&gt;&gt; &gt;&gt; very simple games, again with the above approaches, and ending with a<br>
&gt;&gt;&gt;&gt; &gt;&gt; conversion of a very old game of mine (Zarathrusta written in<br>
&gt;&gt;&gt;&gt; &gt;&gt; assembler from<br>
&gt;&gt;&gt;&gt; &gt;&gt; 1991, which was based on Thrust from 1986, converted by myself in C++<br>
&gt;&gt;&gt;&gt; &gt;&gt; to<br>
&gt;&gt;&gt;&gt; &gt;&gt; PocketPC as G-Pod, and so I would like to make a version in Haskell<br>
&gt;&gt;&gt;&gt; &gt;&gt; that<br>
&gt;&gt;&gt;&gt; &gt;&gt; runs on the iPhone :-)<br>
&gt;&gt;&gt;&gt; &gt;&gt; This of course is a lot of work, and I would like to put this on the<br>
&gt;&gt;&gt;&gt; &gt;&gt; Haskell wiki or a blog or something, so others can contribute and<br>
&gt;&gt;&gt;&gt; &gt;&gt; comment. I<br>
&gt;&gt;&gt;&gt; &gt;&gt; would like to show real examples that explain the shortcomings of the<br>
&gt;&gt;&gt;&gt; &gt;&gt; FRP<br>
&gt;&gt;&gt;&gt; &gt;&gt; approaches, because now this is still a bit blurry to me.<br>
&gt;&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt; On Wed, Aug 19, 2009 at 5:43 PM, David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; This Monad you&#39;ve created is quite excellent.  I was trying to do<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; something like this about a year ago, to make the input and output<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; handling<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; of an interactive bowling score card work nicely.  I kept running<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; into<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; issues, and did not believe that seq was going to do the trick.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;  Nice work!<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; This is a very useful monad I think, it could be called &quot;Prompter&quot;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; or<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; something to that effect.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; Do you mind if I use it in some of my code?<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; Dave<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; On Wed, Aug 19, 2009 at 8:42 AM, Peter Verswyvelen<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; &lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt; LOL. Maybe we should have that coffee together ;-) at least<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt; virtually!<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 5:39 PM, David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; Argh... I too have been up too late :-).  I edited THE WRONG FILE!<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;  No<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; wonder your change didn&#39;t take effect!  :-/<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; Time for coffee I suppose.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 8:38 AM, David Leimbach<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; This doesn&#39;t seem to be working for me interactively though on a<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; Mac.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;  I still get &quot;Welcome&quot; before I&#39;ve entered text.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 8:25 AM, Peter Verswyvelen<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; I fixed it myself but it&#39;s really tricky :-)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; <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><br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; The idea is, that when the input is requested, the output that<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; is<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; then generated must be in sync with the input.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; inp = S $ \s i -&gt; let r = (s `D.append` (i `seq` D.empty), head<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; i) in<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; (tail i, r)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; I first had<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; inp = S $ \s i -&gt; let r = (i `seq` s, head i) in (tail i, r)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; But that was too eager, since i syncs the input not with the<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; output,<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; but with the function that will generate the output.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; Okay, now I can sleep again :-)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 5:12 PM, Peter Verswyvelen<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Thanks, but that doesn&#39;t really matter in my example, my code<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; is<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; just buggy, and I&#39;m not sure why. For example if I change my<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; test function<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; so that it outputs lines only, then it still prints Welcome<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; first before<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; asking for input.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; See<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 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><br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 5:00 PM, David Leimbach<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Try LineBuffering.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; I do linewise stuff with interact a lot.  You&#39;ll find stuff<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; like<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; unlines . lines<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; may help too.  In fact I just wrote a blog post about this.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; <a href="http://leimy9.blogspot.com" target="_blank">http://leimy9.blogspot.com</a><br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; I&#39;m trying to write some interactive code to automate working<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; with<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; serial console controlled power strips, so I need to either<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; use Expect<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; (yuck) or do my own thing.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Dave<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 7:35 AM, Peter Verswyvelen<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Apparently this particular example happens to work on Mac and<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Linux because of different buffering (thanks Martijn for the<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; help!)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; To make sure we have no buffering at all, the main function<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; should<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; be:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; main = do<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   hSetBuffering stdout NoBuffering<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   hSetBuffering stdin NoBuffering<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   test<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Now I think it should also be incorrect on Unix systems.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; I guess the way I&#39;m concatenating the strings is not correct,<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; not<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; sure.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; I would like to use a graphical tool to show the graph<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; reduction<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; step by step, to get a better understanding of the laziness &amp;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; strictness.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Does such a tool exist? I know people often say this is not<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; usable because<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; the amount of information is too much, but I used to be an<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; assembly language<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; programmer so I still would like to give it a try :-)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; On Wed, Aug 19, 2009 at 1:07 PM, Peter Verswyvelen<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; &lt;<a href="mailto:bugfact@gmail.com" target="_blank">bugfact@gmail.com</a>&gt; wrote:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; In an attempt to get a deeper understanding of several<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; monads<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; (State, ST, IO, ...) I skimmed over some of the research<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; papers (but didn&#39;t<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; understand all of it, I lack the required education) and<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; decided to write a<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; little program myself without using any prefab monad<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; instances that should<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; mimic the following:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; main = do<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   putStrLn &quot;Enter your name:&quot;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   x &lt;- getLine<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   putStr &quot;Welcome &quot;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   putStrLn x<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;   putStrLn &quot;Goodbye!&quot;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; But instead of using IO, I wanted to make my own pure monad<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; that<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; gets evaluated with interact, and does the same.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; However, I get the following output:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Enter your name:<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Welcome ......<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; So the Welcome is printed too soon.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; This is obvious since my monad is lazy, so I tried to put a<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; seq<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; at some strategic places to get the same behavior as IO. But<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; I completely<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; failed doing so, either the program doesn&#39;t print anything<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; and asks input<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; first, or it still prints too much output.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Of course I could just use ST, State, transformers, etc, but<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; this<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; is purely an exercise I&#39;m doing.<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; So, I could re-read all papers and look in detail at all the<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; code, but maybe someone could help me out where to put the<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; seq or what to do<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; :-)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; The code is<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; at <a href="http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316" target="_blank">http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316</a><br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Oh btw, the usage of DList here might not be needed;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; intuitively<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; it felt like the correct thing to do, but when it comes to<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Haskell, my<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; intuition is usually wrong ;-)<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Thanks a lot,<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Peter Verswyvelen<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Haskell-Cafe mailing list<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; &gt; Haskell-Cafe mailing list<br>
&gt;&gt;&gt;&gt; &gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt;&gt;&gt;&gt; &gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div></div></div></div></div></div>
</blockquote></div><br></div>