0

ねえ-素晴らしいコーダーとハスケラー、私はハスケルの新入生で、次の状況に要約されるプログラムに問題があります

main :: IO ()
main = do
    putStrLn "\nplease give me some input"
    input1 <- getLine
    putStrLn "\nplease give me another input"
    input2 <-getLine
    putStrLn ("\nyour inputs were "++show(input1)++" and "++ show(input2)")
    putStrLn "restart ?? yY or nN"
    c <- getChar
    restart c
    where 
    restart c
        |elem c "yY" = do
            main
        |elem c "nN" = putStrLn "\nExample Over"
        |otherwise = do
            putStrLn "\nyou must type one of Yy to confirm or nN to abort"
            c'<- getChar
            restart c'

メインの最初の実行以外で

input1 <- getLine

次のようにスキップされ、私はそれの理由を見つけることができません

input2 <- getLine

期待どおりに実行されます、私はどんな提案にもオープンであり、事前に感謝を助けますε/ 2

4

1 に答える 1

5

修正:NoBufferingプログラムの開始時に設定:

hSetBuffering stdin NoBuffering

これで問題が解決するのはなぜですか? NoBuffering を使用していないときに入力しているものを見てください。入力すると、以下がgetLine消費されます。

first input[enter]

次に、入力すると、getLine#2が消費します:

second input[enter]

次に、次のように入力します。

 y[enter]

ただし、最初の呼び出しで読み取られる をgetChar消費してバッファリングしたyままにするだけです。なぜ入力したのですか?あなたがしなければならなかったので、端末が行バッファリングされていたので、'y' を押すだけではループしませんでした。[enter]getLine[enter]main

于 2011-04-09T16:00:23.870 に答える