首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于进度跟踪的Monad转换器

用于进度跟踪的Monad转换器
EN

Stack Overflow用户
提问于 2011-12-19 11:13:05
回答 3查看 937关注 0票数 17

我正在寻找一个单变压器,可以用来跟踪程序的进展。要解释如何使用它,请考虑以下代码:

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. 通过一个函数返回当前任务名称/步骤索引堆栈,并在过程中的中断点继续。在返回的continuation上重复调用此函数将完成过程的执行。
  2. 通过一个函数执行一个操作,该操作描述了当任务步骤完成时要执行的操作。该过程将无法控制地运行,直到它完成,通过提供的操作“通知”环境有关更改。

对于解决方案(1),我已经使用Yield挂起函数器查看了Control.Monad.Coroutine。对于解决方案(2),我不知道任何可用的monad转换器将是有用的。

我正在寻找的解决方案不应该有太多的性能开销,并允许尽可能多地控制过程(例如,不需要IO访问或其他东西)。

这些解决方案中的一个听起来可行吗,或者已经有其他解决方案来解决这个问题了?这个问题已经用我找不到的monad transformer解决了吗?

编辑:目标不是检查是否所有步骤都已执行。我们的目标是能够在进程运行时对其进行“监控”,这样就可以知道它已经完成了多少。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8556746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档