【发布时间】:2020-09-15 18:36:30
【问题描述】:
我正在寻找一种从标准输入读取的方法,过了一会儿,如果没有输入,我想跳过那个 getLine。
我有这段代码在 3 秒后跳过第一个 getLine,但当它到达第二个 getLine 时,我必须输入两次。有什么建议吗?
main :: IO ()
main = do
putStrLn "x:"
x <- timeout 3000000 getLine
putStrLn "y:"
y <- getLine
putStrLn y
【问题讨论】:
-
所以你希望
getLine无论如何都会发生,只有它的输出会在 3 秒后被忽略。一种方法是让一个辅助线程读取这些行,并将它们放入主线程提供的MVars 中。一种邪恶的方法是使用惰性 IO。 -
无法重现。当我等待 3 秒后,输入 30,然后按 Enter,它会立即打印 30 并退出。
-
好吧,我等 3 秒,输入 30,我必须再次输入 30 才能打印并退出。
-
我也无法在 Linux 上重现,无论是通过 GHC 编译的可执行文件还是从“GHCi”运行。如果我等待“y:”提示出现的时间足够长(即大约 3 秒),我只需要输入 30
一次,程序就会回显它并退出。您在哪个平台上运行它,您是作为独立编译的可执行文件运行它还是在 GHCi 下运行它? -
我在Windows上测试过,使用ghc编译的exe。
标签: haskell io nonblocking