Я ищу монадный трансформатор, который можно использовать для отслеживания хода процедуры.Чтобы объяснить, как это будет использоваться, рассмотрим следующий код:
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
должен иметь явный номер шагапараметр из-за детерминизма программы / проблемы остановки.
Монада, как описано выше, может быть реализована, как я вижу, одним из двух способов:
- Через функцию, которая будетвернуть текущее имя задачи / стек индекса шага и продолжение процедуры в том месте, где она была остановлена.Повторный вызов этой функции для возвращенного продолжения завершит выполнение процедуры.
- Через функцию, которая предприняла действие, описывающее, что делать после завершения шага задачи.Процедура будет выполняться бесконтрольно, пока она не будет завершена, «уведомляя» среду об изменениях с помощью предоставленного действия.
Для решения (1) я рассмотрел Control.Monad.Coroutine
с функтором Yield
,Что касается решения (2), я не знаю ни одного уже доступного монадного трансформатора, который был бы полезен.
Решение, которое я ищу, не должно иметь слишком много служебной нагрузки и позволять так много контроля над процедурой.насколько это возможно (например, не требуется доступ к вводу-выводу или что-то в этом роде).
Оправдывает ли одно из этих решений жизнеспособность или уже есть другие решения этой проблемы где-нибудь?Эта проблема уже решена с помощью монадного трансформатора, который мне не удалось найти?
РЕДАКТИРОВАТЬ: Цель состоит не в том, чтобы проверить, все ли шаги были выполнены.Цель состоит в том, чтобы иметь возможность «контролировать» процесс во время его выполнения, чтобы можно было определить, сколько из него завершено.