我是Haskell的新手,一直試圖更好地理解IO monad(在使用純函數玩了一段時間之後)。Haskell中的自定義循環打印兩次語句
我下面就以IO monad
之一演習正在一會兒功能的教程。他們沒有顯示一個例子,所以你不能檢查你的答案。
這裏是我的:
while :: IO Bool -> IO()
while action = do p <- action
if p then putStrLn "You win!" >> return()
else putStrLn "Nope. Try again!" >> while action
main = do putStrLn "Come and guess the letter!"
while (constAskForC)
where constAskForC = do c <- getChar
return $ c == 'c'
現在,我的問題是,如果你輸入一個錯誤的字符(幾乎是一個字,是不是「C」),然後串「不再試一次!」打印兩次到StdOut。爲什麼是這樣?這裏的程序運行:
Come and guess the letter!
"Nope. Try again!"
"Nope. Try again!"
d
"Nope. Try again!"
"Nope. Try again!"
"Nope. Try again!"
"Nope. Try again!"
a
"Nope. Try again!"
"Nope. Try again!"
d
"Nope. Try again!"
"Nope. Try again!"
f
"Nope. Try again!"
"Nope. Try again!"
a
"Nope. Try again!"
"Nope. Try again!"
s
"Nope. Try again!"
"Nope. Try again!"
如果你只是按回車(輸入沒有字符),那麼它只會打印一次。任何人都可以向我解釋我做錯了什麼?
謝謝。
我最初的猜測是緩衝模式。導入'System.IO'後試試'hSetBuffering stdout LineBuffering',看看是否解決了你的問題。 – bheklilr
你輸入一個字母並按下回車鍵。一封信是一個字符。Enter是另一個字符。這給出了兩個字符,數它們;) –