【发布时间】:2012-11-25 23:48:07
【问题描述】:
假设我有一个记录,其中一个值为 MVar:
data SomeRecord = SomeRecord { frobs :: MVar Integer }
我希望能够使用 Aeson 从 JSON 编码/解码它。编码时,MVar 会被解包并编码原始值,而解码时会发生相反的情况。
如果能够编写一个返回 IO (Maybe SomeRecord) 的 FromJSON 实例和一个返回 IO ByteString 的 ToJSON 实例,那就太好了,但由于 Parser monad 不是 MonadIO 的实例,我不认为这是可能的。
到目前为止,我已经求助于编写函数来在 MVar-encumbered 记录和几乎相同的没有 MVar 类型的记录之间进行转换,然后对其进行编码/解码。
我一开始就试图找到一些方法来让 MVar 不在我的记录中。这似乎是理想的。但是假设由于某种原因我不能这样做,有没有更简单的方法来处理 JSON 编码/解码?
编辑:
我想知道我是否问错了问题。也许我的整个方法是不正确的。我要做的是允许一堆连接的客户端(每个客户端在不同的线程上)添加/编辑/删除对象列表。以下是这些类型的外观:
-- the data type for each "room"
data Instance = Instance
{ iName :: T.Text
, iObjects :: M.HashMap T.Text (MVar Store)
...
}
-- the data type for a particular object in the room that can be changed
data Store = Store
{ sObject :: A.Value
...
}
每个“房间”都有一个 Instance 来保存房间对象。 Instance 本身位于一个 MVar 中,用于同步 iObjects hashmap 的添加/删除,每个单独的存储都位于一个 MVar 中,这样整个数据结构就不必在单个对象更新时阻塞。
所以更新操作是这样进行的:
- 在实例上读取 MVar 以获取 iObjects 哈希
- M.查找特定商店
- 在商店中修改MVar 以进行更新
有没有比使用这样的嵌套 MVar 更惯用的 Haskell 方法?理想情况下,某种使 MVar 远离数据的方法很简单。
【问题讨论】:
标签: haskell