Mam kilka prostych operacji prymitywnych, na przykład:Czy możliwe jest przechowywanie na dysku haskela "operacyjnego" lub "wolnego monada"?
W przypadku operational monady:
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
lub w przypadku free monady:
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()
Proste działania jest taka sama w obu przypadki, na przykład:
proc1 :: Process()
proc1 = forever $ do
a <- getInput
b <- getInput
dump $ a ++ b
dump $ b ++ a
Moje pytanie brzmi:: Czy można zinterpretować proces (proc1) w taki sposób, aby kontynuacja w pewnym etapie została przekształcona na dysk w postaci szeregowej, a następnie przywrócona podczas następnego uruchomienia programu? Czy mógłbyś podać przykład?
Jeśli nie jest możliwe, jakie byłoby najbliższe obejście tego problemu?
Chciałbym uruchomić program tylko wtedy, gdy następne wejście jest dostępne, zastosować kontynuację wejścia, następnie interpretować do następnego "getInput" i wyjść.
Mogę sobie wyobrazić scenariusz do rejestrowania wszystkich danych wejściowych, a następnie powtórzyć je, aby system działał w tym samym stanie przed kontynuowaniem, ale w tym przypadku dziennik będzie rósł bez ograniczeń. Nie mogłem znaleźć żadnego sposobu na zapisanie dziennika w tłumaczu, ponieważ nie ma możliwości porównania kontynuacji (bez instancji EQ), a proces jest nieskończony.
Nie tak, nie sądzę (choć jest możliwe, że niektóre specjalizacje GHC do obliczeń rozproszonych mogą to zrobić — Nigdy w nich nie zagłębiałem). Najlepszym standardem jest prawdopodobnie wymienienie wygody i ogólności klasy 'Monad' Haskella dla twojej własnej wersji niestandardowej, która reprezentuje funkcje w jakimś abstrakcyjnym języku, który możesz zinterpretować. – dfeuer