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

Peter Verswyvelen bugfact at gmail.com
Wed Aug 19 11:25:43 EDT 2009

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090819/96008fb9/attachment.html

More information about the Haskell-Cafe mailing list