gpt4 book ai didi

haskell - 是否可以将 haskell "operational"或 "free monad"延续存储到磁盘?

转载 作者:行者123 更新时间:2023-12-02 08:43:10 25 4
gpt4 key购买 nike

我有一些简单的原始操作,例如:

如果是operational单子(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单子(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 实例)并且该过程是无限的。

最佳答案

据我所知,存在两个问题:

  • 延续可以包含任意数据类型

  • 延续可以包含函数(即闭包)

特别是考虑到第二个约束,可能没有简单的方法可以完全做你想要的事情。

关于Can Haskell functions be serialized?的讨论指向一个名为 packman 的库。来自自述文件:

...the functionality can be used to optimise programs by memoisation (across different program runs), and to checkpoint program execution in selected places. Both uses are exemplified in the slide set linked above.

(The slides我想它提到了。)

这种方法的局限性在于,并非所有类型的数据都可以(或应该!)序列化,尤其是可变类型,例如 IORefMVar 和 STM 相关类型,有时这些最终会导致 thunk 和闭包,从而导致运行时异常。

此外,该库依赖于由创建它的同一二进制文件占用的序列化延续,这对于您的应用程序来说可能是也可能不是真正的问题。

因此,您可以使用像 packman 这样稍微有限且复杂的方法来获得或多或少的结果,或者您可以编写自己的自定义逻辑,该逻辑在自定义类型之间进行序列化,该自定义类型捕获所有您关心的信息。

关于haskell - 是否可以将 haskell "operational"或 "free monad"延续存储到磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39271579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com