2

来自 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'

如何使用提供的实例?

4

1 回答 1

7

我认为这意味着任何IntMap (Binary e)类型都可以序列化,但事实并非如此:

它确实(除了它应该读到 anyIntMap e是可序列化的,如果有instance Binary e)。

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

您收到的错误消息几乎可以肯定意味着IntMap您使用的不是IntMap来自containers您构建的包binary,而是来自另一个版本。IntMap来自不同版本的 s是containers不同的类型,并且该Binary实例仅适用binary于构建时使用的确切版本。

自从containers安装binary.

通过在命令行上为 ghci指定一个标志,并通过用于编译,使用构建的containers版本。binary-packageCabal

于 2013-03-24T22:06:06.477 回答