getLine不会停止

dmv*_*nna 2 haskell user-input ghc

我的程序就像是

main :: IO String
main = do
  putStrLn "input a"
  a <- getChar
  putStrLn "input b"
  b <- getLine
  putStrLn "input c"
  c <- getChar
  return a:c:b
Run Code Online (Sandbox Code Playgroud)

行为:打印出"输入a",程序等待我键入Char并按回车键.从那里,它滚过getLine而不让我输入一些东西.我怎样才能让它按照我的意图去做呢?

PS:这段代码可能存在更多问题,但让我们关注我目前的问题.

Dav*_*aro 6

该问题是由默认启用的stdin缓冲引起的 .

  1. 在文件的顶级导入IO

    import System.IO
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加到您的主要(在任何getChar调用之前)

    hSetBuffering stdin NoBuffering
    
    Run Code Online (Sandbox Code Playgroud)
import System.IO
main = do
  hSetBuffering stdin NoBuffering
  putStrLn "input a"
  a <- getChar
  putStrLn "input b"
  b <- getLine
  putStrLn "input c"
  c <- getChar
  print $ a:(c:b)
Run Code Online (Sandbox Code Playgroud)


Lol*_*4t0 6

当您按下X,然后EnterX\n进入你的键盘缓冲区.

getCharX但离开\n.然后立即getLine阅读\n并完成.

在阅读之前,您可以阅读\n另一个尾随getLine清理键盘缓冲区b

main :: IO String
main = do
  putStrLn "input a"
  a <- getChar
  getLine --clean kbd buffer
  putStrLn "input b"
  b <- getLine
  putStrLn "input c"
  c <- getChar
  return (a:c:b)
Run Code Online (Sandbox Code Playgroud)