Haskell做语法和I / O.

时间:2011-06-03 02:55:34

标签: haskell ghc ghci

我正在玩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 个答案:

答案 0 :(得分:8)

这是常见问题解答。你的线路正在缓冲。使用:

import System.IO

main = do
    hSetBuffering stdout NoBuffering
    ...

此外,您的代码有点......独一无二。例如,你说:

hstring <- return $ hello name
putStr hstring

当你能做到:

let hstring = hello name
putStr hstring

或只是:

putStr $ hello name