[Haskell-cafe] Re: Where do I put the seq?

Peter Verswyvelen bugfact at gmail.com
Wed Aug 19 11:55:56 EDT 2009


Not at all, use it for whatever you want to :-)
I'm writing this code because I'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...

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 Thrust
<http://www.bytecellar.com/archives/000106.php>from 1986, converted by
myself in C++ to PocketPC as
G-Pod<http://www.handango.com/catalog/ProductDetails.jsp?productId=16574&platformId=30>,
and so I would like to make a version in Haskell that runs on the iPhone :-)

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.



On Wed, Aug 19, 2009 at 5:43 PM, David Leimbach <leimy2k at gmail.com> wrote:

> This Monad you'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!
> This is a very useful monad I think, it could be called "Prompter" or
> something to that effect.
>
> Do you mind if I use it in some of my code?
>
> Dave
>
>
> On Wed, Aug 19, 2009 at 8:42 AM, Peter Verswyvelen <bugfact at gmail.com>wrote:
>
>> LOL. Maybe we should have that coffee together ;-) at least virtually!
>>
>> On Wed, Aug 19, 2009 at 5:39 PM, David Leimbach <leimy2k at gmail.com>wrote:
>>
>>> Argh... I too have been up too late :-).  I edited THE WRONG FILE!  No
>>> wonder your change didn't take effect!  :-/
>>> Time for coffee I suppose.
>>>
>>>
>>> On Wed, Aug 19, 2009 at 8:38 AM, David Leimbach <leimy2k at gmail.com>wrote:
>>>
>>>> This doesn't seem to be working for me interactively though on a Mac.  I
>>>> still get "Welcome" before I've entered text.
>>>>
>>>>
>>>> On Wed, Aug 19, 2009 at 8:25 AM, Peter Verswyvelen <bugfact at gmail.com>wrote:
>>>>
>>>>> I fixed it myself but it's really tricky :-)
>>>>> http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8330
>>>>>
>>>>> <http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8330>The idea is,
>>>>> that when the input is requested, the output that is then generated must be
>>>>> in sync with the input.
>>>>>
>>>>> inp = S $ \s i -> let r = (*s** **`**D**.**append**`** **(**i** **`**seq**`** **D**.**empty**)*, head i) in (tail i, r)
>>>>>
>>>>>
>>>>>
>>>>> I first had
>>>>>
>>>>> inp = S $ \s i -> let r = (i `seq` *s*, head i) in (tail i, r)
>>>>>
>>>>>
>>>>> But that was too eager, since i syncs the input not with the output,
>>>>> but with the function that will generate the output.
>>>>>
>>>>> Okay, now I can sleep again :-)
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Wed, Aug 19, 2009 at 5:12 PM, Peter Verswyvelen <bugfact at gmail.com>wrote:
>>>>>
>>>>>> Thanks, but that doesn't really matter in my example, my code is just
>>>>>> buggy, and I'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.
>>>>>> See e.g. http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316#a8328
>>>>>>
>>>>>> On Wed, Aug 19, 2009 at 5:00 PM, David Leimbach <leimy2k at gmail.com>wrote:
>>>>>>
>>>>>>> Try LineBuffering.
>>>>>>> I do linewise stuff with interact a lot.  You'll find stuff like
>>>>>>>
>>>>>>> unlines . lines
>>>>>>>
>>>>>>> may help too.  In fact I just wrote a blog post about this.
>>>>>>>
>>>>>>> http://leimy9.blogspot.com
>>>>>>>
>>>>>>> I'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.
>>>>>>>
>>>>>>> Dave
>>>>>>>
>>>>>>> On Wed, Aug 19, 2009 at 7:35 AM, Peter Verswyvelen <
>>>>>>> bugfact at gmail.com> wrote:
>>>>>>>
>>>>>>>> Apparently this particular example happens to work on Mac and Linux
>>>>>>>> because of different buffering (thanks Martijn for the help!)
>>>>>>>> To make sure we have no buffering at all, the main function should
>>>>>>>> be:
>>>>>>>>
>>>>>>>> main = do  hSetBuffering stdout NoBuffering  hSetBuffering stdin NoBuffering  test
>>>>>>>>
>>>>>>>> Now I think it should also be *incorrect* on Unix systems.
>>>>>>>>
>>>>>>>> I guess the way I'm concatenating the strings is not correct, not
>>>>>>>> sure.
>>>>>>>>
>>>>>>>> I would like to use a graphical tool to show the graph reduction
>>>>>>>> step by step, to get a better understanding of the laziness & 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 :-)
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Wed, Aug 19, 2009 at 1:07 PM, Peter Verswyvelen <
>>>>>>>> bugfact at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> In an attempt to get a deeper understanding of several monads
>>>>>>>>> (State, ST, IO, ...) I skimmed over some of the research papers (but didn'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:
>>>>>>>>> main = do
>>>>>>>>>   putStrLn "Enter your name:"
>>>>>>>>>   x <- getLine
>>>>>>>>>   putStr "Welcome "
>>>>>>>>>   putStrLn x
>>>>>>>>>   putStrLn "Goodbye!"
>>>>>>>>>
>>>>>>>>> But instead of using IO, I wanted to make my own pure monad that
>>>>>>>>> gets evaluated with interact, and does the same.
>>>>>>>>>
>>>>>>>>> However, I get the following output:
>>>>>>>>>
>>>>>>>>> Enter your name:
>>>>>>>>> Welcome ......
>>>>>>>>>
>>>>>>>>> So the Welcome is printed too soon.
>>>>>>>>>
>>>>>>>>> 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't print anything and asks input
>>>>>>>>> first, or it still prints too much output.
>>>>>>>>>
>>>>>>>>> Of course I could just use ST, State, transformers, etc, but this
>>>>>>>>> is purely an exercise I'm doing.
>>>>>>>>>
>>>>>>>>> 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 :-)
>>>>>>>>>
>>>>>>>>> The code is at http://hpaste.org/fastcgi/hpaste.fcgi/view?id=8316
>>>>>>>>>
>>>>>>>>> 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 ;-)
>>>>>>>>>
>>>>>>>>> Thanks a lot,
>>>>>>>>> Peter Verswyvelen
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Haskell-Cafe mailing list
>>>>>>>> Haskell-Cafe at haskell.org
>>>>>>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090819/cd823387/attachment.html


More information about the Haskell-Cafe mailing list