【问题标题】:Dynamic stdout in HaskellHaskell 中的动态标准输出
【发布时间】:2015-11-20 01:15:53
【问题描述】:

我有简单的命令行界面,在数据库中插入记录和 现在它会向标准输出写入大量信息,如下所示:

...    
record 856/1000: 85%
record 857/1000: 85%
record 858/1000: 85%
...

但我希望有 1 条动态行来更新当前字符串参数

 status         |T    | C   | A   | E
 ---------------------------------------
   inserting    |1000 | 857 | 85% | 96  

我怎样才能做到这一点?

【问题讨论】:

  • ncurses 或像this 这样的更高级别的进度条库我认为可以。
  • 我也听说过关于brick 的好消息。
  • 只需打印一份 CR - 请参阅这个 SO 问题:stackoverflow.com/q/31900566/866915
  • @fjarri ascii-progress 不错!
  • @HaoLian 砖似乎太多了我的需求

标签: haskell command-line-interface


【解决方案1】:

如果只有一行,可以使用\r将光标回退到行首。

这是一个例子:

import Control.Concurrent
import Control.Monad
import Text.Printf

main :: IO ()
main = do
    forM_ [10, 9 .. 1] $ \seconds -> do
        printf "\rLaunching missiles in %2d..." (seconds :: Int)
        threadDelay $ 1 * 1000 * 1000
    putStrLn "\nBlastoff!"

【讨论】:

    【解决方案2】:

    Joey Hess 的 concurrent-output 库专为这样的进度输出(以及更复杂的变体)而设计。

    http://hackage.haskell.org/package/concurrent-output

    https://joeyh.name/blog/entry/a_tiling_region_manager_for_the_console/

    【讨论】:

      猜你喜欢
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多