7

我在一个项目中使用酸状态,我非常喜欢它。我喜欢在没有太多样板的情况下向普通的 Haskell 数据类型添加持久性是多么容易。

据我了解,酸状态会记录事件日志,而不是在每次更新时写出整个新状态。我正在寻找的是一种让我从应用程序中查看最近状态更改日志的方法,作为(只读)列表。(类似于git log,尽管我不需要分支或能够返回到较旧的提交。)

当然,我可以将所有状态更改的详细信息写入我自己的单独日志文件,甚至可以将我的数据建模为差异列表,但我更喜欢自动的并且允许我尽可能使用普通数据类型的东西。

是否有一个类似于酸状态的库,或者可能是酸状态的一些内部功能,我可以使用它?

4

1 回答 1

2

这是我最终采用的方法:

我已经在使用一个包装器Data.Acid.update(因为它在一个 IO 受限的 monad 中运行)并且我意识到包装器可以将事件存储到我自己的日志中。UpdateEvent update约束意味着SafeCopy update并且我可以将其runPut . safePut序列化为ByteString. 然而......这是一个二进制表示,不是为了人类可读的,我希望能够查看它。我意识到从磁盘读取酸状态事件日志也会有同样的问题。

所以我添加Show update了我的包装器的约束。在每个使用我添加的状态的地方:

{-# LANGUAGE StandaloneDeriving #-}

...

$(makeAcidic ''State ['update])

deriving instance Show Update

(StandaloneDeriving 可能有点争议,但它不会在此处引起孤儿问题,因为它在同一个文件中。)

在包装器中,我现在调用show更新并将结果写入我自己的日志文件。当然,这会失去更新的原子性:应用程序可能会在update调用和我自己的日志调用之间崩溃,但我愿意接受这种风险。

于 2015-06-21T08:52:39.867 回答