【问题标题】:Serialize a data type defined with type classes序列化使用类型类定义的数据类型
【发布时间】:2014-01-19 13:21:58
【问题描述】:

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

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 和 2 是多态的。给其中一个类型签名(例如:: Int),看看会发生什么。
  • 你试过Bin.encode $ Dawg.fromList [("foo",1::Int),("bar",2::Int)]吗?我认为Binary 需要一个具体类型才能自动序列化数字。
  • 我刚试过这个,但 GHC 仍然抱怨(尽管它知道将图形类型识别为 Dawg.DAWG Char Int)。
  • 如果没有看到错误,很难猜测发生了什么...也许您启用了OverloadedStrings? Bin.encode $ Dawg.fromList [("foo"::String,1::Int),("bar",2)]呢?
  • 好吧,你肯定会有一个带有匹配哈希的binary 实例。问题是你是否还有另一个。 ghc-pkg list binary 显示了多少个binary 包?

标签: haskell


【解决方案1】:

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

包dawg 可能针对包binary 的特定实例进行编译,我们称之为binary-A。您可能还安装了binary、binary-B 的第二个实例。现在,如果 GHCi 决定从 binary-B 导入 Data.Binary,那么它的 Binary 类将被认为不同于 Binary 类,dawg 为其定义了一个实例。

解决方案是明确选择正确的binary 实例,例如使用-package-id 标志。如果您在项目中使用cabal,那么它将自动尝试解决项目的依赖关系,从而选择所有相关包的一致版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2021-08-25
    相关资源
    最近更新 更多