如何使用参数化实例声明(Data.Binary)?

时间:2013-03-24 21:31:39

标签: haskell serialization types instance

来自Data.Binary:

instance (Binary e) => Binary (IntMap.IntMap e) where
    put = put . IntMap.toAscList
    get = liftM IntMap.fromDistinctAscList get

我认为这意味着任何IntMap (Binary e)类型都是可序列化的,但它不会:

Data.Binary Data.IntMap> encode $ ((fromList [])::IntMap Int)

<interactive>:12:1:
    No instance for (Binary (IntMap Int))
      arising from a use of `encode'

如何使用提供的实例?

1 个答案:

答案 0 :(得分:6)

  

我认为这意味着任何IntMap (Binary e)类型都是可序列化的,但它不会:

确实如此(除了应该阅读的词组,如果有IntMap e,任何instance Binary e都是可序列化的。

Prelude Data.IntMap Data.Binary> encode (fromList [] :: IntMap Int)
"\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL"

您几乎可以肯定的错误消息表示您使用的IntMap不是containers所构建的binary包中的IntMap,但是从另一个版本。不同版本的IntMap中的containers是不同的类型,Binary实例仅适用于使用的binary版本。

自您安装containers以来,您可能安装了较新版本的binary

使用构建的containers版本binary,在命令行上为ghci指定-package标志,并使用Cabal进行编译。