haskell -skipping getLine

时间:2011-04-09 15:43:04

标签: haskell getline

嘿 - 伟大的程序员和haskellers, 我是一名哈斯克尔新生并且有一个程序问题 归结为以下情况

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

1 个答案:

答案 0 :(得分:5)

修复:在程序开头设置NoBuffering

hSetBuffering stdin NoBuffering

为什么这会解决问题?当你不使用NoBuffering时,看看你正在输入什么!您输入,getLine消费:

first input[enter]

然后键入,getLine#2消耗:

second input[enter]

然后输入:

 y[enter]

但是getChar只消耗了y并留下了[enter]缓冲,这是您的第一个getLine来电读取的!你为什么键入[enter]?因为你必须这样做,只是点击'y'不会导致main循环,因为终端是行缓冲的。