7

私のアプリケーションでは、任意のデータ型を含むベクトルをシリアル化する必要があります。この場合は、Double のリストです。ベクトルをシリアル化するために、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"
4

1 に答える 1

7

わかりました、ここに問題があると思います。vector-binary-instances パッケージは以下を定義します:

instance (Data.Vector.Generic.Base.Vector v a, Binary a) => Binary (v a)

これは非常に悪いです。この定義は、「任意のタイプ 'v a' について、これは有効な Binary インスタンスである」ことを意味します。つまり、このインスタンスは、一致するすべてのタイプv aで使用できます。これには、すべてのリスト、すべてのファンクター、およびすべてのモナドが含まれます (ただし、これらに限定されません)。デモンストレーションとして、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

ここで、インタプリタはこのインスタンスを に使用しようとしていますがgetChar :: IO Char、これは明らかに間違っています。

簡単な答え: 今のところ vector-binary-instances を使用しないでください。このインスタンスは壊れており、インスタンスが Haskell コードを介してどのように伝播するかを考えると、問題が発生します。これが修正されるまでは、ベクター用に独自のバイナリ インスタンスを作成する必要があります。vector-binary-instances からコードをコピーして、モノモーフィックなベクター型に制限できるはずです

instance (Binary a) => Binary (Vector a) where

これは、Data.Vector.Generic.Vector のインスタンスである任意の Vector で機能すると思います。

これについて vector-binary-instances メンテナーに連絡することもできます。

于 2010-07-25T17:41:38.250 に答える