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

Ryan Ingram ryani.spam at gmail.com
Wed Aug 19 13:23:12 EDT 2009


I posted a reply to your paste with a stricter version of S and some cleanup.

Untested, though I believe it should work without "seq".

"case" provides all the strictness you need, I think!

  -- ryan

On Wed, Aug 19, 2009 at 9:28 AM, Peter Verswyvelen<bugfact at gmail.com> wrote:
> Expect more bugs with this though :-) Just found out that looping does not
> work, it hangs, e.g.
>
> test = do
>   out "Enter your first name:"
>   fstName <- inp
>   out "Enter your second name:"
>   sndName <- inp
>   out ("Welcome "++fstName++" "++sndName)
>   out "Goodbye!"
>   test
>
> Doesn't seem to work :-) Back to the drawing board.
>
> On Wed, Aug 19, 2009 at 5:55 PM, Peter Verswyvelen <bugfact at gmail.com>
> wrote:
>>
>> 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 from 1986, converted by myself in C++ to
>> PocketPC as G-Pod, 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
>>>>>>> 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
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>


More information about the Haskell-Cafe mailing list