假设我有一个记录,其中一个值为 MVar:
data SomeRecord = SomeRecord { frobs :: MVar Integer }
我希望能够使用 Aeson 从 JSON 编码/解码它。编码时,MVar 将被解包并编码原始值,而解码时会发生相反的情况。
能够编写一个返回 anIO (Maybe SomeRecord)
的 FromJSON 实例和一个返回 an 的 ToJSON 实例会很好IO ByteString
,但是由于 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 中,以便在更新单个对象时整个数据结构不必阻塞。
因此更新操作如下进行:
- 实例上的 readMVar 以获取 iObjects 哈希
- M.查找特定商店
- 在 store 上 modifyMVar 进行更新
有没有比使用这样的嵌套 MVar 更惯用的 Haskell 方法?理想情况下,某种使 MVar 远离数据的方法,因此持久化整个结构会很简单。