我正在寻找一个单变压器,可以用来跟踪程序的进展。要解释如何使用它,请考虑以下代码:
procedure :: ProgressT IO ()
procedure = task "Print some lines" 3 $ do
liftIO $ putStrLn "line1"
step
task "Print a complicated line" 2 $ do
liftIO $ putStr "li"
step
liftIO $ putStrLn "ne2"
step
liftIO $ putStrLn "line3"
-- Wraps an action in a task
task :: Monad m
=> String -- Name of task
-> Int -- Number of steps to complete task
-> ProgressT m a -- Action performing the task
-> ProgressT m a
-- Marks one step of the current task as completed
step :: Monad m => ProgressT m ()
我意识到,由于一元律,step
必须显式存在,而由于程序确定性/暂停问题,task
必须具有显式的步数参数。
在我看来,上面描述的monad可以通过以下两种方式之一实现:
对于解决方案(1),我已经使用Yield
挂起函数器查看了Control.Monad.Coroutine
。对于解决方案(2),我不知道任何可用的monad转换器将是有用的。
我正在寻找的解决方案不应该有太多的性能开销,并允许尽可能多地控制过程(例如,不需要IO访问或其他东西)。
这些解决方案中的一个听起来可行吗,或者已经有其他解决方案来解决这个问题了?这个问题已经用我找不到的monad transformer解决了吗?
编辑:目标不是检查是否所有步骤都已执行。我们的目标是能够在进程运行时对其进行“监控”,这样就可以知道它已经完成了多少。
https://stackoverflow.com/questions/8556746
复制相似问题