当我最近尝试序列化我使用的数据结构时 Data.Bimap,我遇到了Bimap不是实例的问题 SafeCopy。
现在,看了一下Data.SafeCopy.Instances后,我想出了 以下内容:
instance (SafeCopy a, SafeCopy b, Ord a, Ord b) => SafeCopy (Bimap a b) where
getCopy = contain $ fmap fromAscPairList safeGet
putCopy = contain . safePut . toAscList
这可以编译,但我不知道它是否做得对。
答案 0 :(得分:1)
您的实施的SafeCopy部分是正确的,但Bimap部分存在问题。问题是toAscList
和fromAscPairList
有不同的要求。在documentation for bimap中说明了以下这些功能:
<强> toAscList:强>
按升序转换为关联对的列表,左侧值。
<强> fromAscPairList:强>
从对列表中构建bimap,其中列表的fst和snd两半都是严格按升序排列。
因此toAscList将构建一个左侧值按顺序排列的列表,而fromAscPairList则要求两个值都按顺序排列。因此,当您尝试反序列化两个值不具有相同排序的映射时,您的实现将导致运行时错误。这是一个例子:
> fromAscPairList $ toAscList $ fromList [(1,3),(2,2)]
fromList *** Exception: Data.Bimap.fromAscPairList: list not correctly ascending
您可以将toAscList
替换为toList
,将fromAscPairList
替换为fromList
,以解决此问题。