如何让Bimap成为SafeCopy的一个实例?

时间:2014-04-09 18:36:13

标签: haskell serialization typeclass

当我最近尝试序列化我使用的数据结构时 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

这可以编译,但我不知道它是否做得对。

1 个答案:

答案 0 :(得分:1)

您的实施的SafeCopy部分是正确的,但Bimap部分存在问题。问题是toAscListfromAscPairList有不同的要求。在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,以解决此问题。