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

これはFAQのようなものです。あなたの行はバッファリングされています。使用する:

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 に答える