An IO Question from a Newbie
jcast at cate0-46.reshall.ou.edu
Sun Sep 21 22:02:57 EDT 2003
> On Fri, 12 Sep 2003 16:27:59 -0600
> Matt O'Connor <angagon at earthlink.net> wrote:
> > Hello all. I'm new to functional programming and Haskell, but have
> > been programming in C and Java for a while. I've been going through
> > the tutorials and whatnot on haskell.org. I've read from the Gentle
> > Introduction to Haskell about IO and some of the other stuff and I
> > have a question about it.
> > main = do putStr "Type Something: "
> > str <- getLine
> > putStrLn ("You typed: " ++ str)
> > When compile and run this code the "Type Something: " isn't displayed
> > until the putStrLn. So there is no prompt. The output looks like
> > this.
> > s
> > Type Something: You typed: s
> > But if I change the putStr "Type Something: " to a putStrLn or put a
> > \n at the end of the string it displays the text immediately (ie, when
> > I want it to). Is there a good reason for this? Am I doing something
> > wrong? Or do I need to call some kind of standard output flush?
> Yes, the problem is that the first line is not being flushed. Importing
> hFlush and stdout from IO (or System.IO) and adding hFlush stdout after
> you putStr will fix it. Alternatively, you could change the buffering
> on stdout to NoBuffering. I don't know if there is a standard
> putStrWithFlush function or just a better answer than this. A
> putStrWithFlush would be trivial to write or more generally to a
> HOF that flushed after performing the action passed to it.
Just thought I'd point out (in case it isn't clear) that this function
is flushAfter h a = liftM2 const a (hFlush h). Not much of an
More information about the Haskell-Cafe