getLine不会停止

时间:2016-02-12 13:36:19

标签: 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

行为:我得到&#34;输入&#34;打印出来,程序等我输入Char并按回车键。从那里,它滚动过 getLine ,而不会让我输入任何东西。我怎样才能让它按照我的意图去做呢?

P.S。:此代码可能存在更多问题,但请关注我目前的问题。

3 个答案:

答案 0 :(得分:6)

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

  1. 在文件顶层导入IO

    import System.IO
    
  2. 添加到(在任何 getChar 电话之前)

    hSetBuffering stdin NoBuffering
    
  3. 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)
    

答案 1 :(得分:6)

当您按 X 然后 Enter 时,您将X\n输入键盘缓冲区。

getChar读取X,但离开\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)

答案 2 :(得分:3)

我想我知道你在说什么(即使你的代码没有编译),这应该解决它(至少它通常对我来说):

import System.IO

hSetBuffering stdin NoBuffering
hSetBuffering stdout NoBuffering
顺便说一句:我认为我在 eshell 和GHCi内部的窗口中存在这些问题,但我并不是百分百肯定 - 但从来没有在bash中使用

当然它也可能是getChargetLine的奇怪组合;)

无论如何:

import System.IO

main :: IO ()
main = do

  hSetBuffering stdin NoBuffering
  hSetBuffering stdout NoBuffering

  putStrLn "input a"
  a <- getLine
  putStrLn "input b"
  b <- getLine
  putStrLn "input c"
  c <- getLine
  print (a,b,c)

应打印提示并让您输入3个输入,最后打印元组