Haskell делает синтаксис и ввод / вывод - PullRequest
4 голосов
/ 03 июня 2011

Я играл с простой программой на 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 Ответ

8 голосов
/ 03 июня 2011

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

import System.IO

main = do
    hSetBuffering stdout NoBuffering
    ...

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

hstring <- return $ hello name
putStr hstring

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

let hstring = hello name
putStr hstring

или просто:

putStr $ hello name
...