order of computation in 'do' notation

Rich rich.geary@ntlworld.com
Thu, 25 Apr 2002 11:50:32 +0100

Hi, I have to hand in my final project for my degree next week.  I've been 
running my program through hugs most of the time, and I wanted to compile 
it to an executable, so I used ghc.  Unfortunately ghc makes the program 
behave in a different, undesirable way.  The code where the problem lies is 
shown below.  Basically, in hugs, the prompt ">> " is displayed and then it 
waits for a command to be entered (getCommand) - which is what I want, but 
when I put the same code through ghc, it waits for a command first, and 
then when the command has been entered it displays the prompt, which is 
just silly.  Surely the 'do' notation was designed to sequence 
computations, but it obviously isn't behaving quite right here!

I'd be very grateful for any suggestions as to how to fix this.

mainLoop :: IO TRS -> IO ()
mainLoop t = do putStr "\n>> "
                (c,a) <- getCommand 0
                case c of
                   "help" -> do putStr help
                                mainLoop t
                   "load" -> do trs <- load a
                                putStr ""
                                mainLoop (return trs)
                   "show" -> ...and so on...

And then the getCommand function is as follows:

-- gets a command from the standard input
getCommand :: Int -> IO (String,String)
getCommand _ = do com <- getLine
		  return (splitComm com)

-- splits a command into the main command and arguments
splitComm :: String -> (String,String)
splitComm []       = ("","")
splitComm (' ':cs) = ("",cs)
splitComm (c:cs)   = ((c:rest),rem)
		     where (rest,rem) = splitComm cs