簡體   English   中英

是否可以將haskell“可操作”或“免費monad”延續存儲到磁盤?

[英]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的庫。 從自述文件:

...該功能可用於通過記憶(跨不同程序運行)優化程序,並在選定位置檢查程序執行。 上面鏈接的幻燈片集中舉例說明了這兩種用法。

(我想它提到的幻燈片 。)

這種方法的局限性在於,並非所有類型的數據都可以(或應該!)進行序列化,尤其是可變類型,例如IORefMVar和STM相關類型,並且有時這些類型最終會導致重排和關閉,從而導致運行時異常。

此外,該庫依賴於創建它的同一個二進制文件占用的序列化延續這對您的應用程序可能不是真正的問題。

因此,您可以通過諸如packman類的略有限制和復雜的方法來packman或者可以編寫自己的自定義邏輯,該邏輯可以與捕獲您所關心的所有信息的自定義類型進行序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM