我需要将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)]
答案 0 :(得分:2)
如果安装了同一个软件包的两个或多个版本/实例,可能会导致此类问题。
可能会针对包dawg
的特定实例编译包binary
,我们称之为binary-A
。您可能还安装了binary
,binary-B
的第二个实例。现在,如果GHCi决定从Data.Binary
导入binary-B
,则其Binary
类将被视为与Binary
为dawg
定义实例的binary
类不同。 / p>
解决方案是显式选择正确的-package-id
实例,例如使用cabal
标志。如果您为项目使用{{1}},那么它将自动尝试解决项目的依赖关系,以便选择所有相关软件包的一致版本。