On Fri, Aug 21, 2009 at 6:53 PM, David Menendez <dave@zednenem.com> wrote:
You would still need to determine whether you've reached EOF or not,
which forces the input to be determined up to the first line-break or
EOF.

Good point!  I actually had it on my TODO list, but that settles it then :)

 run :: MyIO () -> Behavior
> run m = runCont m (\_ _ -> [])
> foo = do
>    putLine "Enter name: "
>    name <- getLine
>    putLine ("Welcome " ++ name ++ "\n")
> main = interact (run foo . lines)
> You get the "Welcome" before the name again.
> To be honest I don't fully understand why this is a horrible hack.

It isn't. Some people dislike seq because it lets you force strictness
in cases where pattern matching cannot (like function arguments), but
hardly anyone objects to pattern matching.

Ah so it's subjective. Okay, it's sometimes hard for a newbie to find the "truth" when several experts contradict eachother. Because often when people claim something here, they have very good reasons for it, reasons that are not obvious at all to your average newbie!
 
> Too bad that something extremely simple like console text IO doesn't seem to
> be a good start for introducing FRP, or maybe seen from another angle (using
> Reactive) it might still be, dono

Are you writing an introduction to using FRP, or an introduction to
implementing FRP? Every Haskell FRP implementation I'm aware of uses
the IO monad internally.

Both really. I think to start with I just want to start a blog to write down random pieces (like this interesting conversation), and then see where this will lead me. I'm mainly interested in doing a survey of existing systems, comparing pros/cons with clear examples (at least for myself ;), and also making minimal implementations so I understand the essence of the various techniques.

If you want to be able to run in an entirely pure manner, you might
investigate IOSpec.

<http://hackage.haskell.org/package/IOSpec>

Ah I didn't know that one yet, thanks