Haskell делает синтаксис и ввод / вывод

Я играл с простой программой на Haskell:

hello :: String -> String
hello s = "Hello, " ++ (trim s) ++ "!\n"

trim :: String -> String
trim [] = []
trim s = head $ words s

main :: IO()
main = do putStr "\nPlease enter your name: "
          name <- getLine
          hstring <- return $ hello name
          putStr hstring

Это результат, который я ожидаю:

Please enter your name: John Doe
Hello, John!

Это работает, как и ожидалось, когда я загружаю программу в ghci. Однако, когда я компилирую программу, используя

ghc -o hello.exe hello.hs

он запускается, ожидает ввода, а затем печатает обе подсказки одновременно:

John Doe
Please enter your name: Hello, John!

Почему поведение интерактивной среды и компилятора отличается, и как я могу заставить компилятор делать то, что я хочу?

Заранее спасибо за помощь!

1 ответ

Решение

Это что-то вроде FAQ. Ваши строки буферизуются. Использование:

import System.IO

main = do
    hSetBuffering stdout NoBuffering
    ...

Кроме того, ваш код немного... уникален. Например, вы говорите:

hstring <- return $ hello name
putStr hstring

Когда вы могли бы сделать:

let hstring = hello name
putStr hstring

или просто:

putStr $ hello name
Другие вопросы по тегам