haskell -пропуск getLine - PullRequest
       10

haskell -пропуск getLine

0 голосов
/ 09 апреля 2011

эй - отличные программисты и хакелеры, я новичок в Haskell, и у меня возникла проблема с программой, которая сводится к следующей ситуации

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'

при любом выполнении, кроме первого выполнения main

input1 <- getLine

пропущено, и я не могу найти причины для этого, так как следующее

input2 <- getLine

выполнено, как и ожидалось, я открыт для любых предложений и помощи, заранее спасибо ε / 2

1 Ответ

5 голосов
/ 09 апреля 2011

Исправление: установите NoBuffering в начале вашей программы:

hSetBuffering stdin NoBuffering

Почему это решает проблему? Посмотрите, что вы печатаете, когда вы не используете NoBuffering! Вы набираете, а getLine потребляет:

first input[enter]

Затем вы набираете, а getLine # 2 потребляет:

second input[enter]

Затем вы набираете:

 y[enter]

Но getChar только потребляет y и оставляет [enter] в буфере, который читает ваш первый вызов getLine! Почему вы набрали [enter]? Поскольку вы должны были сделать это, простое нажатие на 'y' не привело к циклу main, потому что терминал был буферизован.

...