Data.Vector.Binary重叠Binary [a]实例

uu1*_*101 7 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.Vector v a, Binary a) =>
           Binary (v a)
    -- Defined in Data.Vector.Binary
  instance (Binary a) => Binary [a] -- Defined in Data.Binary
Run Code Online (Sandbox Code Playgroud)

该列表是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"
Run Code Online (Sandbox Code Playgroud)

Joh*_*n L 7

好的,我想我在这里看到了问题.vector-binary-instances包定义:

instance (Data.Vector.Generic.Base.Vector v a, Binary a) => Binary (v a)
Run Code Online (Sandbox Code Playgroud)

这非常糟糕.这个定义意味着"对于任何类型'v a',这是一个有效的二进制实例".这意味着此实例可用于任何匹配的类型v a.这包括(但不限于)所有列表,所有仿函数和所有monad.作为演示,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
Run Code Online (Sandbox Code Playgroud)

这里解释器试图使用这个实例getChar :: IO Char,这显然是错误的.

简答:现在不要使用vector-binary-instances.这个实例被破坏,并且考虑到实例如何通过Haskell代码传播,它将导致问题.在修复此问题之前,您应该为向量编写自己的二进制实例.您应该能够从vector-binary-instances复制代码并将其限制为单态矢量类型

instance (Binary a) => Binary (Vector a) where
Run Code Online (Sandbox Code Playgroud)

我相信这将适用于任何Vector,它是Data.Vector.Generic.Vector的一个实例.

您也可以与vector-binary-instances维护者联系.