У меня есть несколько простых примитивных операций, например:
В случае монады operational:
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 монады:
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) и процесс бесконечен.
Monad
Haskell на вашу собственную версию, которая представляет функции на каком-то абстрактном языке, который вы можете интерпретировать. - person dfeuer   schedule 01.09.2016