Haskell循环直到按下一个键

时间:2014-04-22 13:00:11

标签: haskell

我想每隔n秒运行一个程序并刷新屏幕(某些行)直到我按下q键。怎么做到这一点?

我已检查ansi-terminal包以刷新屏幕的某些部分。我猜我应该使用haskeline来获取循环和用户按键。我是对的吗?

如果是,我无法在haskeline中找到该功能。

1 个答案:

答案 0 :(得分:2)

IO来自threadDelay Control.Concurrent的{​​{1}} Monad外,你可以做到这一点。

import Control.Concurrent

refreshInterval :: Int
refreshInterval = 10000 -- in microseconds

refreshAction :: IO ()
refreshAction = undefined

main :: IO ()
main = do refreshAction
          threadDelay refreshInterval
          main

使用此结构,您现在可以通过任何为您提供键盘输入的库来合并键盘退出。例如,使用haskeline,您可以使用getInputChar读取输入,将其与退出字符进行比较,并在必要时退出。但是直接这样做会让你在线程与threadDelay一起睡觉时无法读取输入。如果你的输入库缓冲读取,这可能没问题 - 当程序到处检查输入时,就会发生退出/中断操作。如果您需要更多,可以按照评论中的建议通过forkIO推送自己的解决方案,或者移动到更好地处理此类事情的库。

作为一个有趣的附注,我可以使用包含OpenCV的HighGUI功能的库部分在我的OpenCV库中轻松解决这个问题。我不一定建议仅为此功能提供依赖性,但它在技术上解决了您的问题。如果有人有兴趣,我会在这个答案中添加。