0

嘿 - 伟大的编码员和 Haskell,我是一名 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

4

1 回答 1

5

修复:NoBuffering在程序开始时设置:

hSetBuffering stdin NoBuffering

为什么这可以解决问题?看看你在不使用 NoBuffering 时输入的内容!您输入并使用getLine

first input[enter]

然后你输入,getLine#2 消耗:

second input[enter]

然后你输入:

 y[enter]

getChar只消耗y并离开[enter]缓冲,您的第一次getLine调用会读取!你为什么打字[enter]?因为你必须这样做,所以仅仅点击 'y' 并不会导致main循环,因为终端是行缓冲的。

于 2011-04-09T16:00:23.870 回答