最近,当我试图序列化使用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这是编译,但我不知道它是否做了正确的事情。
发布于 2014-04-10 14:07:11
您的实现的SafeCopy部分是正确的,但是Bimap部分有一个问题。问题是toAscList和fromAscPairList有不同的需求。在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来解决此问题。
https://stackoverflow.com/questions/22971197
复制相似问题