У меня есть некоторые простые примитивные операции, например:
В случае operational monad:
import Control.Monad.Operational
type Process a = Program ProcessI a
data ProcessI a where
GetInput :: ProcessI String
Dump :: String -> ProcessI ()
getInput :: Process String
getInput = singleton GetInput
dump :: String -> Process ()
dump = singleton . Dump
Или в случае free monad:
import Control.Monad.Free
type Process = Free ProcessF
data ProcessF a
= GetInput (String -> a)
| Dump String a
deriving (Functor)
getInput :: Process String
getInput = liftF $ GetInput id
dump :: String -> Process ()
dump s = liftF $ Dump s ()
Простые действия в обоих случаях одинаковы, например:
proc1 :: Process ()
proc1 = forever $ do
a <- getInput
b <- getInput
dump $ a ++ b
dump $ b ++ a
Мой вопрос: Возможно ли интерпретировать процесс (proc1) таким образом, что продолжение на определенном этапе сериализуется на диск, а затем восстанавливается во время следующего выполнения программы? Не могли бы вы привести пример?
Если это невозможно, что будет ближайшим обходным путем?
Я хотел бы запустить программу только тогда, когда доступен следующий вход, применить продолжение ввода, затем интерпретировать до следующего "getInput" и выйти.
Я мог представить сценарий для регистрации всех входов, а затем повторить их, чтобы довести систему до того же состояния, прежде чем продолжить, но в этом случае журнал будет расти без ограничений. Я не мог найти способ опроса журнала в интерпретаторе, поскольку нет возможности сравнивать продолжения (нет экземпляра EQ), и процесс бесконечен.