xny*_*hps 7 persistence haskell acid-state
我在一个项目中使用酸状态,我非常喜欢它.我喜欢在没有太多样板的情况下为简单的Haskell数据类型添加持久性是多么容易.
根据我的理解,酸状态记录事件的日志,而不是在每次更新时写出整个新状态.我正在寻找的是一种让我从应用程序中查看状态最近更改日志的方法,作为(只读)列表.(有点像git log,虽然我不需要分支或能够回到较旧的提交.)
当然,我可以写入我自己的单独日志文件,其中包含所有状态更改的详细信息,甚至可以将我的数据建模为差异列表,但我更喜欢自动的东西,并允许我尽可能使用纯数据类型.
是否存在类似于酸状态的库,或者可能用于酸性状态的某些内部功能?
这是我最终采用的方法:
我已经在使用包装器Data.Acid.update(因为它在 IO 受限的 monad 中运行),并且我意识到包装器可以将事件存储到我自己的日志中。该UpdateEvent update约束意味着SafeCopy update我runPut . safePut可以将其序列化为ByteString. 然而......这是一个二进制表示,不适合人类可读,我希望能够审查它。我意识到从磁盘读取酸状态事件日志也会遇到同样的问题。
所以我添加了Show update我的包装器的约束。在每个使用我添加的状态的地方:
{-# LANGUAGE StandaloneDeriving #-}
...
$(makeAcidic ''State ['update])
deriving instance Show Update
Run Code Online (Sandbox Code Playgroud)
(StandaloneDeriving 可能有点争议,但它不会导致此处的孤儿出现问题,因为它位于同一个文件中。)
在包装器中,我现在调用show更新并将结果写入我自己的日志文件中。当然,这会失去更新的原子性:应用程序可能在调用update和我自己的日志记录调用之间崩溃,但我愿意接受这种风险。