4

我在 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!

为什么交互环境和编译器的行为不同,如何让编译器做我想做的事?

在此先感谢您的帮助!

4

1 回答 1

8

这是一个常见问题解答。您的线路正在被缓冲。采用:

import System.IO

main = do
    hSetBuffering stdout NoBuffering
    ...

此外,您的代码有点……独特。例如,你说:

hstring <- return $ hello name
putStr hstring

你什么时候可以这样做:

let hstring = hello name
putStr hstring

要不就:

putStr $ hello name
于 2011-06-03T03:13:33.497 回答