2017-02-11 23 views
1
import Control.Monad 
import Data.Char 

main = forever $ do 
    putStr "Give me some input: " 
    l <- getLine 
    putStrLn $ map toUpper l 

私はハスケルを学んだことから、あなたはhaskellを学んでいます。私はこのコードを実行しようとすると、それは必要なように動作しません。putstrで間違ったタイミングでメッセージが表示される

l 
Give me some input: L 
abc 
Give me some input: ABC 

これを実行すると、文字列が最初に印刷されずに入力できます。いくつかの入力を提供した後、この場合はlは、このように私を返します:Give me some input: L

何をすべきかは、Give me some input:を入力して入力を求め、入力後に入力を大文字に戻します。

どうすればこの問題を解決できますか?ここでの問題はputStrは改行を書き込みませんということです

import Control.Monad 
import Data.Char 

main = forever $ do 
    putStrLn "Give me some input: " 
    l <- getLine 
    putStrLn $ map toUpper l 

+1

バッファリングに問題がある可能性があります。 stdinとstdoutの 'hSetBuffering'でバッファリングを無効にして、問題が解決されているかどうか確認してください。 – Michail

+0

プロンプトに 'putStr'の代わりに' putStrLn'を使用しますか? – Bergi

+0

@Michail、それを設定した後に動作します。ありがとう! –

答えて

2

Michailが指摘するように、それはstdoutためhSetBufferingで解決することができますバッファリングの問題で、次のとおりです。あなたがプログラム全体のためbuffer modeを変更したくない何らかの理由場合

import Control.Monad 
import Data.Char 
import System.IO 

main = do 
    hSetBuffering stdout NoBuffering 
    forever $ do 
    putStr "Give me some input: " 
    l <- getLine 
    putStrLn $ map toUpper l 

、あなたはhFlushを使用すると、必要な場所でバッファを余分にフラッシュすることができます。

import Control.Monad 
import Data.Char 
import System.IO 

main = do 
    forever $ do 
    putStr "Give me some input: " 
    hFlush stdout 
    l <- getLine 
    putStrLn $ map toUpper l 
1

はこれを試してみてください。出力バッファは改行でのみフラッシュされます。

関連する問題