2017-02-27 5 views
3

私はHaskellを初めて使いました。コード実行中にユーザーからの入力を受け入れる方法を理解できません。私はこのコードを入力すると言う:Haskell - ランタイム中に入力を受け取ります

import System.IO 

main = do 
    putStrLn "Hi, what's your name?" 
    name <- getLine 
    putStrLn ("Hi " ++ name) 

まあ、私はその後、"Hi, name"後にユーザーのタイプ自分の名前二行目を印刷し、私は私の名前に入力したテキスト"Hi, what's your name?"が前を示したいと思います。 しかし、現時点では、の後に表示されるテキストはありません。の後に私の名前を入力してください。これは質問が冗長になります。なぜなら、質問は回答した​​後でなければユーザーに提示されないからです。

私はこれがノービスの質問かもしれないことは知っていますが、私は長い間成功していませんでした。御時間ありがとうございます。

+0

あなたのコードは私のために完全に正常に動作します。おそらくあなたはそれを間違って使っているでしょう。どうやってそれを呼びますか? – Rainbacon

+3

あなたは 'putStr'ではなく、上記のコードのように' putStrLn'を使用していますか?それはバッファリングの問題のように聞こえる。 – chi

答えて

5

おそらく、システムのデフォルトのバッファリングが原因であると考えられます。 hSetBufferingを使用してバッファリングを整列するバッファリングモードを設定し、明示的に試してみてください:

main = do 
    hSetBuffering stdout LineBuffering 
    hSetBuffering stdin LineBuffering 
    putStrLn "Hi, what's your name?" 
    name <- getLine 
    putStrLn ("Hi " ++ name) 
+1

stdoutが端末に接続されているときに、すべての正常な実装でAFAIKの回線バッファリングがデフォルトになります。これがうまくいくなら、私はまだどこかで根本的な原因を探します。 – user2847643

+0

これは修正しました。ありがとうございます。と@ user2847643、私はそれを調べます。 – Greg

関連する問題