У меня есть некоторые простые примитивные операции, например:Можно ли сохранить haskell «операционная» или «свободная монада» на диск?
В случае 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), и процесс бесконечен.
Не так, я не думаю (хотя возможно, что некоторые специальные предложения GHC для распределенных вычислений могут это сделать — Я никогда не врывался в них). Лучший стандартный подход, вероятно, заключается в том, чтобы обменять удобство и общность класса Haskell 'Monad' для вашей собственной версии, которая представляет функции на некотором абстрактном языке, который вы можете интерпретировать. – dfeuer