2011-06-03 56 views
4

我用一個簡單的程序玩弄在Haskell:哈斯克爾做語法和I/O

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! 

爲什麼是交互式環境和編譯器之間不同的行爲,我怎樣才能讓編譯器做我想做的事?

在此先感謝您的幫助!

+0

'主要= putStr 「請輸入你的名字:」 >>函數getline >> = putStr。你好「 - 只是爲了好玩。 – 2011-06-03 20:25:38

回答

8

這是常見問題。您的線路正在緩衝。使用:

import System.IO 

main = do 
    hSetBuffering stdout NoBuffering 
    ... 

此外,您的代碼有點...獨特。例如,你說:

hstring <- return $ hello name 
putStr hstring 

當你可以這樣做:

let hstring = hello name 
putStr hstring 

或者只是:

putStr $ hello name 
+2

當禁用所有緩衝過多時,明智地使用'hFlush stdout'是個不錯的選擇。 – Anthony 2011-06-03 07:03:44

+0

我仍然不明白爲什麼在問題中發佈的代碼會導致錯誤的輸出。這個符號中的動作是不是應該被排序? – is7s 2011-06-03 12:06:22

+0

@ is7s,這也是我的想法。 – astay13 2011-06-03 12:18:41