[英]Is it possible to store haskell “operational” or “free monad” continuation to disk?
我有一些簡單的原始操作,例如:
如果是可操作的單核:
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
或在免費 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實例)並且過程是無限的,因此我找不到在解釋器中記錄日志的任何方法。
如我所見,有兩個問題:
連續可以包含任意數據類型
延續可以包含函數(即閉包)
特別是考慮到第二個約束,可能沒有簡單的方法可以精確地完成您想要的操作。
關於Haskell函數是否可以序列化的討論? 指向一個名為packman的庫。 從自述文件:
...該功能可用於通過記憶(跨不同程序運行)優化程序,並在選定位置檢查程序執行。 上面鏈接的幻燈片集中舉例說明了這兩種用法。
(我想它提到的幻燈片 。)
這種方法的局限性在於,並非所有類型的數據都可以(或應該!)進行序列化,尤其是可變類型,例如IORef
, MVar
和STM相關類型,並且有時這些類型最終會導致重排和關閉,從而導致運行時異常。
此外,該庫依賴於創建它的同一個二進制文件占用的序列化延續,這對您的應用程序可能不是真正的問題。
因此,您可以通過諸如packman
類的略有限制和復雜的方法來packman
或者可以編寫自己的自定義邏輯,該邏輯可以與捕獲您所關心的所有信息的自定義類型進行序列化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.