我正在一个项目中使用acid-state,我非常喜欢它。我喜欢将持久性添加到普通Haskell数据类型而不需要太多样板的简单方式。
据我所知,acid-state保留了事件日志,而不是在每次更新时写出整个新状态。我正在寻找的是一种方法,让我可以在应用程序中以(只读)列表的形式查看最近状态更改的日志。(像git log这样的东西,尽管我不需要分支,也不需要返回到较旧的提交。)
当然,我可以将所有状态更改的详细信息写入到我自己的单独日志文件中,甚至可以将我的数据建模为差异列表,但我更喜欢自动的,并且允许我尽可能多地使用普通数据类型。
有没有类似于acid-state的库,或者可能有一些acid-state的内部功能可以用来做这件事?
发布于 2015-06-21 16:52:40
以下是我最终采用的方法:
我已经在Data.Acid.update周围使用了一个包装器(因为它在具有受限IO的monad中运行),并且我意识到包装器可以将事件存储到我自己的日志中。UpdateEvent update约束意味着SafeCopy update,使用runPut . safePut我可以将其序列化为ByteString。然而..。这是一个二进制表示,不是为了便于阅读,我希望能够查看它。我意识到从磁盘读取acid状态事件日志也会有同样的问题。
因此,我将Show update添加到包装器的约束中。在使用我添加的状态的每个地方:
{-# LANGUAGE StandaloneDeriving #-}
...
$(makeAcidic ''State ['update])
deriving instance Show Update(StandaloneDeriving可能有点争议,但它不会对这里的孤儿造成问题,因为它在同一个文件中。)
在包装器中,我现在在更新时调用show,并将结果写入我自己的日志文件。当然,这会失去更新的原子性:应用程序可能会在update调用和我自己的日志记录调用之间崩溃,但我愿意承担这种风险。
https://stackoverflow.com/questions/30936644
复制相似问题