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