说我有一个记录,其中一个值是一个MVAR:JSON编码包括MVAR
data SomeRecord = SomeRecord { frobs :: MVar Integer }
,我希望能够编码/使用埃宋它从JSON解码。编码时,MVar将被解开并且原始值被编码,并且相反将在解码时发生。
这将是很好能够只写一个返回IO (Maybe SomeRecord)
和返回IO ByteString
一个的toJSON实例FromJSON实例,但因为解析器单子不是MonadIO的一个实例,我不认为这是可能的。
到目前为止,我已经采取了编写函数来翻译MVar设防的记录和几乎相同的没有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
散列映射的添加/删除操作,并且每个单独的存储位于MVar中,以便在更新单个对象时不必阻止整个数据结构。
所以更新操作过程如下所示:
- 上的实例readMVar获得在iObjects哈希
- M.lookup特定的商店
- modifyMVar在店里做了更新
有没有像使用嵌套MVars更习惯性的haskell方法?理想情况下,可以使MVar远离数据,从而保持整个结构的简单性。
我明白了,'''''''''类型的巧妙手段。我想这正是我正在寻找的! – jhickner