Serialization Data.Vector.Binary与二进制[a]实例重叠

Serialization Data.Vector.Binary与二进制[a]实例重叠,serialization,haskell,vector,instances,overlapping,Serialization,Haskell,Vector,Instances,Overlapping,在我的应用程序中,我需要序列化包含任意数据类型的向量,在本例中是一个双精度列表。为了序列化向量,我将导入Data.vector.Binary 在GHCi中加载模块时,出现以下错误: Overlapping instances for Binary [Double] arising from a use of `decode' at Statistics.hs:57:33-42 Matching instances: instance (Data.Vector.Generic.Base.V

在我的应用程序中,我需要序列化包含任意数据类型的向量,在本例中是一个双精度列表。为了序列化向量,我将导入Data.vector.Binary

在GHCi中加载模块时,出现以下错误:

Overlapping instances for Binary [Double]
  arising from a use of `decode' at Statistics.hs:57:33-42
Matching instances:
  instance (Data.Vector.Generic.Base.Vector v a, Binary a) =>
           Binary (v a)
    -- Defined in Data.Vector.Binary
  instance (Binary a) => Binary [a] -- Defined in Data.Binary
列表是Vector的一个实例吗? 我查阅了文档,但没有找到这样的实例

我能做些什么来序列化这个结构

编辑:

我正在使用以下软件包版本:

  • 向量-0.6.0.2
  • 向量二进制实例-0.1.2
  • 二进制-0.5.0.2
这里还有一个片段显示了问题,这次是一个字符列表:

import Data.Binary
import Data.Vector.Binary
import qualified Data.ByteString.Lazy as L

main = L.writeFile "/tmp/aaa" $ encode "hello"

好的,我想我看到问题了。矢量二进制实例包定义:

instance (Data.Vector.Generic.Base.Vector v a, Binary a) => Binary (v a)
这是非常糟糕的。此定义意味着“对于任何类型的‘va’,这是一个有效的二进制实例”。这意味着此实例可用于与
va
匹配的任何类型。包括(但不限于)所有列表、所有函子和所有单子。作为示范,ghci报告如下:

Prelude Data.Binary Data.Vector.Binary Data.ByteString.Lazy> :t getChar
getChar :: IO Char
Prelude Data.Binary Data.Vector.Binary Data.ByteString.Lazy> encode getChar
<interactive>:1:0:
    No instance for (Data.Vector.Generic.Base.Vector IO Char)
      arising from a use of `encode' at <interactive>:1:0-13
    Possible fix:
      add an instance declaration for
      (Data.Vector.Generic.Base.Vector IO Char)
    In the expression: encode getChar
    In the definition of `it': it = encode getChar
我相信这将适用于Data.Vector.Generic.Vector实例中的任何向量


您可能还想联系vector binary instances维护人员了解这一点。

您可以发布您正在使用的binary和vector的版本吗?我同意GHCi似乎假设列表是向量。我查看了矢量二进制实例的源代码,但没有找到它。这并不明显。Edward Kmett不久前在《非常感谢您的解释》中解释了这个问题,并且与Edward Kmett答案的链接有助于理解为什么会发生这种情况。引用他的话:“在很多方面,‘实例’和‘类’定义的语法是反向的。”。我会按照你的建议去做,对此我很感激。包裹已经更新了。我现在只分别列举了装箱和未装箱的向量情况(注意,你不能只使用“向量a”,因为这只是装箱的情况)。@DonStewart感谢你解决了这个问题。如果实例选择依赖于类上下文,那就太好了,但我很确定这将是一个重大的变化,带来许多意想不到的后果。
instance (Binary a) => Binary (Vector a) where