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

Peter Verswyvelen bugfact at gmail.com
Wed Aug 19 11:12:07 EDT 2009


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/6491ce22/attachment.html


More information about the Haskell-Cafe mailing list