序列化使用类型类定义的数据类型

时间:2014-01-19 13:21:59

标签: haskell

我需要将DAWG序列化(由this library)提供给字节字符串。正如我在文档中看到的那样,有一个实例(Ord b, Binary b) => Binary (DAWG a b)似乎为此提供了支持,我尝试直接使用encode

import qualified Data.DAWG.Dynamic as Dawg
import qualified Data.Binary as Bin

Bin.encode $ Dawg.fromList [("foo",1),("bar",2)]

但GHC抱怨no instance for (Bin.Binary (Dawg.DAWG Char b0))。我明白有必要告诉GHC图中包含哪些数据类型,但是,它是如何完成的?如果我错了,我应该做什么呢?

编辑Bin.encode $ Dawg.fromList [("foo"::String,1::Int),("bar",2)]的堆栈跟踪:

<interactive>:19:1:
    No instance for (Bin.Binary (Dawg.DAWG Char Int))
      arising from a use of `Bin.encode'
    Possible fix:
      add an instance declaration for (Bin.Binary (Dawg.DAWG Char Int))
    In the expression: Bin.encode
    In the expression:
      Bin.encode
      $ Dawg.fromList [("foo" :: String, 1 :: Int), ("bar", 2)]
        In an equation for `it':
        it
          = Bin.encode
            $ Dawg.fromList [("foo" :: String, 1 :: Int), ("bar", 2)]

1 个答案:

答案 0 :(得分:2)

如果安装了同一个软件包的两个或多个版本/实例,可能会导致此类问题。

可能会针对包dawg的特定实例编译包binary,我们称之为binary-A。您可能还安装了binarybinary-B的第二个实例。现在,如果GHCi决定从Data.Binary导入binary-B,则其Binary类将被视为与Binarydawg定义实例的binary类不同。 / p>

解决方案是显式选择正确的-package-id实例,例如使用cabal标志。如果您为项目使用{{1}},那么它将自动尝试解决项目的依赖关系,以便选择所有相关软件包的一致版本。