Haskell做语法和I/O.

ast*_*y13 4 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
Run Code Online (Sandbox Code Playgroud)

这是我期待的输出:

Please enter your name: John Doe
Hello, John!
Run Code Online (Sandbox Code Playgroud)

当我将程序加载到ghci时,这可以正常工作.但是当我使用编译程序时

ghc -o hello.exe hello.hs
Run Code Online (Sandbox Code Playgroud)

它启动,等待输入,然后同时打印两个提示:

John Doe
Please enter your name: Hello, John!
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢您的帮助!

Tho*_*son 8

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

import System.IO

main = do
    hSetBuffering stdout NoBuffering
    ...
Run Code Online (Sandbox Code Playgroud)

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

hstring <- return $ hello name
putStr hstring
Run Code Online (Sandbox Code Playgroud)

当你能做到:

let hstring = hello name
putStr hstring
Run Code Online (Sandbox Code Playgroud)

要不就:

putStr $ hello name
Run Code Online (Sandbox Code Playgroud)

  • 当禁用所有缓冲过度时,明智地使用`hFlush stdout`是一个不错的选择. (2认同)