首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell中使用类似acid状态的事件日志

在Haskell中使用类似acid状态的事件日志
EN

Stack Overflow用户
提问于 2015-06-19 19:08:26
回答 1查看 366关注 0票数 7

我正在一个项目中使用acid-state,我非常喜欢它。我喜欢将持久性添加到普通Haskell数据类型而不需要太多样板的简单方式。

据我所知,acid-state保留了事件日志,而不是在每次更新时写出整个新状态。我正在寻找的是一种方法,让我可以在应用程序中以(只读)列表的形式查看最近状态更改的日志。(像git log这样的东西,尽管我不需要分支,也不需要返回到较旧的提交。)

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

有没有类似于acid-state的库,或者可能有一些acid-state的内部功能可以用来做这件事?

EN

回答 1

Stack Overflow用户

发布于 2015-06-21 16:52:40

以下是我最终采用的方法:

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

因此,我将Show update添加到包装器的约束中。在使用我添加的状态的每个地方:

代码语言:javascript
复制
{-# LANGUAGE StandaloneDeriving #-}

...

$(makeAcidic ''State ['update])

deriving instance Show Update

(StandaloneDeriving可能有点争议,但它不会对这里的孤儿造成问题,因为它在同一个文件中。)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30936644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档