Strange difference in behaviour between ghc and ghci

I have a very simple Haskell file (HelloWorld.hs) that reads like this: main = do putStr "What's your name? " n <- getLine putStrLn $ "Pleased to meet you, " ++ n When I load it into ghci, I get the following result, as expected: [1 of 1] Compiling Main ( HelloWorld.hs, interpreted ) Ok, modules loaded: Main. *Main> main What's your name? Matt Pleased to meet you, Matt *Main> However, when I compile the same file using ghc and run it in a terminal, I get a very different result: matt@matt-Lenovo-G575:~/Haskell$ ghc HelloWorld.hs [1 of 1] Compiling Main ( HelloWorld.hs, HelloWorld.o ) Linking HelloWorld ... matt@matt-Lenovo-G575:~/Haskell$ ./HelloWorld Matt What's your name? Pleased to meet you, Matt matt@matt-Lenovo-G575:~/Haskell$ -- in other words, the getLine action is being run before the putStr action, for some strange reason. Is this a bug? Can anyone enlighten me as to what might be going on? Regards, Matt.

Hello! See this similar mailing list question from 2006: http://www.haskell.org/pipermail/haskell/2006-September/018430.html The short answer is that GHCi buffers differently, so you need to be more explicit about flushing. HTH, Arlen On Thursday, 7 June 2012 at 9:22 PM, Matthew Moppett wrote:
I have a very simple Haskell file (HelloWorld.hs) that reads like this:
main = do putStr "What's your name? " n <- getLine putStrLn $ "Pleased to meet you, " ++ n
When I load it into ghci, I get the following result, as expected:
[1 of 1] Compiling Main ( HelloWorld.hs, interpreted ) Ok, modules loaded: Main. *Main> main What's your name? Matt Pleased to meet you, Matt *Main>
However, when I compile the same file using ghc and run it in a terminal, I get a very different result:
matt@matt-Lenovo-G575:~/Haskell$ ghc HelloWorld.hs [1 of 1] Compiling Main ( HelloWorld.hs, HelloWorld.o ) Linking HelloWorld ... matt@matt-Lenovo-G575:~/Haskell$ ./HelloWorld Matt What's your name? Pleased to meet you, Matt matt@matt-Lenovo-G575:~/Haskell$
-- in other words, the getLine action is being run before the putStr action, for some strange reason.
Is this a bug? Can anyone enlighten me as to what might be going on?
Regards,
Matt. _______________________________________________ Beginners mailing list Beginners@haskell.org (mailto:Beginners@haskell.org) http://www.haskell.org/mailman/listinfo/beginners

Hi.
-- in other words, the getLine action is being run before the putStr action, for some strange reason.
Is this a bug? Can anyone enlighten me as to what might be going on?
See http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/ghci-faq.html Last item in the list. Cheers, Andres -- Andres Löh, Haskell Consultant Well-Typed LLP, http://www.well-typed.com

A very quick reply and without reading carefully considering what may be different in GHCI (!), but the output buffer flushes (at least on my system) with newline (if you don;t flush it 'manually'). I suspect if you use putStrLn for 'what's your name' you may get something more like what you want. On 7 Jun 2012, at 12:22, Matthew Moppett wrote:
I have a very simple Haskell file (HelloWorld.hs) that reads like this:
main = do putStr "What's your name? " n <- getLine putStrLn $ "Pleased to meet you, " ++ n
When I load it into ghci, I get the following result, as expected:
[1 of 1] Compiling Main ( HelloWorld.hs, interpreted ) Ok, modules loaded: Main. *Main> main What's your name? Matt Pleased to meet you, Matt *Main>
However, when I compile the same file using ghc and run it in a terminal, I get a very different result:
matt@matt-Lenovo-G575:~/Haskell$ ghc HelloWorld.hs [1 of 1] Compiling Main ( HelloWorld.hs, HelloWorld.o ) Linking HelloWorld ... matt@matt-Lenovo-G575:~/Haskell$ ./HelloWorld Matt What's your name? Pleased to meet you, Matt matt@matt-Lenovo-G575:~/Haskell$
-- in other words, the getLine action is being run before the putStr action, for some strange reason.
Is this a bug? Can anyone enlighten me as to what might be going on?
Regards,
Matt. _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

in other words, in your version "What's your name?" *has* been put in the IO output buffer but this has not been flushed to the terminal yet. You then input your name (without having seen the prompt you were expecting (yet)) and then the newline of your subsequent putStrLn flushes both bits of output at the same time. On 7 Jun 2012, at 12:32, Henry Lockyer wrote:
A very quick reply and without reading carefully considering what may be different in GHCI (!), but the output buffer flushes (at least on my system) with newline (if you don;t flush it 'manually'). I suspect if you use putStrLn for 'what's your name' you may get something more like what you want.
On 7 Jun 2012, at 12:22, Matthew Moppett wrote:
I have a very simple Haskell file (HelloWorld.hs) that reads like this:
main = do putStr "What's your name? " n <- getLine putStrLn $ "Pleased to meet you, " ++ n
When I load it into ghci, I get the following result, as expected:
[1 of 1] Compiling Main ( HelloWorld.hs, interpreted ) Ok, modules loaded: Main. *Main> main What's your name? Matt Pleased to meet you, Matt *Main>
However, when I compile the same file using ghc and run it in a terminal, I get a very different result:
matt@matt-Lenovo-G575:~/Haskell$ ghc HelloWorld.hs [1 of 1] Compiling Main ( HelloWorld.hs, HelloWorld.o ) Linking HelloWorld ... matt@matt-Lenovo-G575:~/Haskell$ ./HelloWorld Matt What's your name? Pleased to meet you, Matt matt@matt-Lenovo-G575:~/Haskell$
-- in other words, the getLine action is being run before the putStr action, for some strange reason.
Is this a bug? Can anyone enlighten me as to what might be going on?
Regards,
Matt. _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

OK -- thanks everybody for your enlightening responses.
Regards,
Matt.
On Thu, Jun 7, 2012 at 9:40 PM, Henry Lockyer
in other words, in your version "What's your name?" *has* been put in the IO output buffer but this has not been flushed to the terminal yet. You then input your name (without having seen the prompt you were expecting (yet)) and then the newline of your subsequent putStrLn flushes both bits of output at the same time.
On 7 Jun 2012, at 12:32, Henry Lockyer wrote:
A very quick reply and without reading carefully considering what may be different in GHCI (!), but the output buffer flushes (at least on my system) with newline (if you don;t flush it 'manually'). I suspect if you use putStrLn for 'what's your name' you may get something more like what you want.
On 7 Jun 2012, at 12:22, Matthew Moppett wrote:
I have a very simple Haskell file (HelloWorld.hs) that reads like this:
main = do putStr "What's your name? " n <- getLine putStrLn $ "Pleased to meet you, " ++ n
When I load it into ghci, I get the following result, as expected:
[1 of 1] Compiling Main ( HelloWorld.hs, interpreted ) Ok, modules loaded: Main. *Main> main What's your name? Matt Pleased to meet you, Matt *Main>
However, when I compile the same file using ghc and run it in a terminal, I get a very different result:
matt@matt-Lenovo-G575:~/Haskell$ ghc HelloWorld.hs [1 of 1] Compiling Main ( HelloWorld.hs, HelloWorld.o ) Linking HelloWorld ... matt@matt-Lenovo-G575:~/Haskell$ ./HelloWorld Matt What's your name? Pleased to meet you, Matt matt@matt-Lenovo-G575:~/Haskell$
-- in other words, the getLine action is being run before the putStr action, for some strange reason.
Is this a bug? Can anyone enlighten me as to what might be going on?
Regards,
Matt. _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
participants (4)
-
Andres Löh
-
Arlen Cuss
-
Henry Lockyer
-
Matthew Moppett