问题标签 [acid-state]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
285 浏览

haskell - 如何放大酸性状态?

鉴于上面的代码,我的印象是应该可以做到这一点:

但 GHC 会抱怨如下:

有任何想法吗?

0 投票
1 回答
422 浏览

haskell - 使用 Data.Acid 时如何处理更改事件的实现

我有一个用于持久性的中等大小的应用程序,Data.Acid我遇到了一种情况,我需要Update为下一个版本的服务器更新我的一个事件的实现。即我有类似的东西

现在,显然我不能随意更改实现,因为它会破坏我的交易历史,所以我想知道人们通常如何处理这个问题。我看到它的方式是:

  1. 停止服务器。为createCheckpoint我的AcidState. 更新Event实现,然后重新启动服务器。由于我们是从新快照加载的,因此更改Update不应触发旧事件。

  2. 创建Update一个新名称(如myUpdate_v2)并更新我的服务器逻辑以仅myUpdate_v2在任何地方使用,而不是原来的myUpdate.

我认为这两种选择都有其优点。(1) 更好,因为我不需要在我的代码库中保留旧功能,但是对于我更新的每台服务器都必须非常小心地完成,否则我有损坏数据的风险。(2) 更安全(特别是如果我从模块的导出中删除旧myUpdate的,所以我可以确定我不会在任何地方不小心使用旧的实现),但否则感觉有点难看。

有没有更好的方法来做到这一点?我认为这是我在一个长期项目中肯定会不时遇到的事情,所以我希望有一个好的、标准的工作流程来将更改应用于我的事件的实现。

0 投票
1 回答
567 浏览

haskell - 如何在 snaplet 中使用 Network.WebSockets.Snap?

能够Network.WebSockets从 snaplet 内部使用模块会很好,但我不知道如何实际做到这一点。

使用它的runWebSocketsSnap :: MonadSnap m => ServerApp -> m ()功能Network.WebSockets.Snap很容易在我的应用程序中包含一个简单的无状态 websocket 服务器:

但我的目标是维护 webscket 服务器的状态(例如,已连接客户端的列表,如http://jaspervdj.be/websockets/example.html)。或者,访问 snaplet 的酸性状态存储会很好。

我的第一个想法是liftIO将 websocket 操作放入Handler App Appmonad,并编写一个像这样的应用程序:

但是没有一个版本runWebSocketsSnap采用上述形式的应用程序,我不知道如何修改现有的应用程序(hackage 上的源代码)。在我看来,需要一个替代方案来代替forkIO在 monad 中采取行动Handler App App,但我对 Haskell 的理解,尤其是 Snap 中的并发性到此结束......

0 投票
1 回答
135 浏览

haskell - 在模板 haskell 中运行模板 haskell

StateDecoder 中的东西不能用于

但是如果我声明一个状态并像这样包装它......

然后它工作

我有很多遵循这种模式的数据类型,所以我想我会写一些 TH 来解决它。

这一切都很好,但是当我尝试跑步时......

我得到...

我知道这与模板 haskell 中的暂存问题有关,但我不知道如何解决。如果我这样做,它会起作用

但这无济于事!

0 投票
1 回答
161 浏览

haskell - 使事件序列在酸性状态下原子化

我正在努力将事件序列分组到一个原子事务中。

考虑Map以酸状态存储,并想象您想要实现Data.Map.alter. 接受可能值并返回 1 的函数无法存储在更改日志中,因此无法定义酸性事件Alter。但是,如果我编写一个调用query st Lookup ...查找旧值然后update st Insert ...写入新值(或删除旧值)的函数,则会出现竞争条件,我可能会破坏其间发生的更新信息。

https://github.com/acid-state/acid-state/pull/48中,我使用了一个额外的MVar来进行手动锁定,但必须有更好的解决方案。

有任何想法吗?

0 投票
1 回答
262 浏览

haskell - 如何对酸性状态的数据实施一元/顺序迁移?

当前状态

我有两种数据类型。

此模式允许每个 Foo 引用任意 Bars 列表。显然,Bars 可以在任意数量的 Foo 之间共享,也可以在没有 Foo 之间共享。

我已经有使用这种模式结构的酸状态持久化的数据。

期望的状态

在期望的状态下,每个 Bar 必须只有一个 Foo,就像常见的多对一 SQL 外键关系一样。

问题

当然,现在没有办法在这两种状态之间完美过渡,因为后者的表现力不如前者。但是,我可以在这里编写处理任何歧义的代码(对于重复引用,更喜欢具有最小 fooId 的 Foo,并简单地删除任何未被 Foo 引用的 Bars)。

我的问题是我看不到任何使用 Safecopy 在这两个模式之间迁移的路径。据我所知,Safecopy 将迁移定义为类型之间的纯函数,我无法查询迁移函数中酸状态的状态。不过,我在这里需要的是一次迁移,在特定时间点的状态上运行一次,并将一个模式转换为另一个模式。有了数据库,这将是微不足道的,但在酸性状态下,我看不到前进的方向。

我拥有的解决方案的唯一暗示是有一个单独的程序(或者说,可以从主程序调用的命令行功能)专门编译以运行处理数据迁移所需的几行代码(比如说,所有Foov0, Barv0 被转换为 Foov1,Bav1),然后在我的主程序中简单地交换新模式。

但是,我什至不明白这是如何工作的。根据我对安全复制的理解,如果我以正常方式定义迁移到新模式,那么一旦我尝试访问数据,我就会得到一个新数据类型的实例,它当然不包含我需要的数据实际迁移数据。

一个(在我看来很笨拙)选项可能是定义另外两种数据类型,将数据复制到它们,然后更改架构并运行将数据复制回新架构的迁移,然后删除其他数据类型. 这需要程序的三个编译才能按顺序在数据上运行,这似乎不是很优雅!

任何指针将不胜感激。

编辑:可能的解决方案

我没有提到上面的模式被包装在一个代表整个程序状态的数据类型中,比如

我认为这意味着我需要做的就是定义一个新的数据 DB 并编写从 DBv0 到 DB 的迁移,在那里处理我的数据,而不需要任何排序或单子活动。如果成功,我将对此进行试验并将其发布为答案。

0 投票
2 回答
209 浏览

haskell - 在与 WAI 处理程序内的数据库通信时避免由 IO 引起的错误

我正在使用 warp、wai 和 acid-state 在 haskell 中编写 Web 服务。到目前为止,我有两个需要数据库交互的处理函数,后者给我带来了麻烦。

首先是注册:

如您所见,我设法IO通过在let _ = ...

在登录功能(目前只返回用户地图)中,我无法避免IO,因为我需要在响应中实际发回结果:

这会导致以下错误:

我相信该错误是由 db 查询返回一个IO值引起的。我的第一个想法是Response将类型签名更改为IO Response,但随后顶层函数抱怨它需要一个Response,而不是一个IO Response

在类似的注释中,我本来希望这样写registerUser

但这会导致非常相似的错误。

为了完整起见,这里是调用registerUserand的函数loginUser

如何避免这些 IO 错误?

0 投票
1 回答
368 浏览

haskell - 在 Haskell 中使用类似酸性状态的事件日志

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

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

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

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

0 投票
1 回答
164 浏览

haskell - Haskell:多个文件的酸性状态?

我有这样的文件结构:

问题是我需要同时调用makeAcidic ''Database [...]它们User.hs并使Post.hs它们的函数变酸,但makeAcidic同时生成IsAcidic实例,Database因此 GHC 抱怨重复的实例声明。

0 投票
1 回答
113 浏览

haskell - 使用 hspec 测试酸性状态

我是一个haskell noob,并且在使用酸状态测试功能时遇到问题。这是我的数据结构

这是我要测试的功能:

这是我的测试:

我不知道如何为我的期望值建模。UserState{ name = "Mike"}不工作