haskell - 控制台中的简单进度指示

标签 haskell progress

在控制台中指示工作进度的最简单方法是什么?输出百分比就足够了,不需要进度条。

仅使用 print会产生很多行,我只想要一个终端中的单个更改字符串。

最佳答案

最简单的方法是执行 wget 和其他程序所做的事情:在进度信息之前打印回车和 ANSI 删除行代码,从而将光标返回到行首并替换现有文本。例如:

import Control.Monad
import Control.Concurrent
import System.IO
import Text.Printf

putProgress :: String -> IO ()
putProgress s = hPutStr stderr $ "\r\ESC[K" ++ s

drawProgressBar :: Int -> Rational -> String
drawProgressBar width progress =
  "[" ++ replicate bars '=' ++ replicate spaces ' ' ++ "]"
  where bars = round (progress * fromIntegral width)
        spaces = width - bars

drawPercentage :: Rational -> String
drawPercentage progress = printf "%3d%%" (truncate (progress * 100) :: Int)

main :: IO ()
main = do
  forM_ [0..10] $ \i -> do
    let progress = fromIntegral i / 10
    putProgress $ drawProgressBar 40 progress ++ " " ++ drawPercentage progress
    threadDelay 250000
  putProgress "All done."
  hPutChar stderr '\n'

这里的关键是不要打印换行符,这样您就可以在下一次进度更新时返回到行首。

当然,您可以在此处打印百分比并删除条形图,但条形图更酷 :)

关于haskell - 控制台中的简单进度指示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8953636/

相关文章:

list - 按秒元素对列表列表进行排序

javascript - 处理 promise 在 promise.all() 中单独解决

c# - System.Net.Http.Handlers.ProgressMessageHandler 立即返回 100%

haskell - OS X 10.9.5 上的 nvcc + c2hs

haskell - 一起使用 Servant、Selda 和 SQLite

iphone - AFNetworking setImageWithURLRequest 下载进度

android - 在 Activity 之间进行过渡

PowerShell:抑制写入进度输出

haskell - 此操作有标准名称吗?

haskell - 一起使用 makeLenses、类约束和类型同义词