나는 예를 들어, 몇 가지 간단한 기본 작업이 있습니다 operational 모나드의 경우haskell "operational"또는 "free 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 모나드의 경우
가 :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 스페셜은 그것을 할 수 있을지 모르지만 — 나는 그것들을 결코 파헤칩니다.) 최선의 표준 접근법은 하스켈의'Monad' 클래스의 편의성과 보편성을 여러분이 해석 할 수있는 추상적 인 언어로 함수를 표현하는 커스텀 버전으로 바꾸는 것입니다. – dfeuer