Data.Vector.Binary overlaps Binary [a] instance

前端 未结 1 865
灰色年华
灰色年华 2021-01-18 05:22

In my application I need to serialize a vector containing an arbitrary datatype, in this case is a list of Doubles. For serializing the vector I\'m importing Data.Vector.Bin

相关标签:
1条回答
  • 2021-01-18 05:41

    Ok, I think I see the problem here. The vector-binary-instances package defines:

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

    which is very bad. This definition means "for any type 'v a', this is a valid Binary instance". That means this instance is available for any type that matches v a. That includes (but is not limited to) all lists, all functors, and all monads. As a demonstration, ghci reports the following:

    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
    

    Here the interpreter is attempting to use this instance for getChar :: IO Char, which is obviously wrong.

    Short answer: don't use vector-binary-instances for now. This instance is broken, and given how instances propagate through Haskell code it will cause problems. Until this is fixed, you should write your own binary instances for vectors. You should be able to copy the code from vector-binary-instances and restrict it to a monomorphic vector type

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

    I believe this will work with any Vector which is an instance of Data.Vector.Generic.Vector.

    You also may want to contact the vector-binary-instances maintainer about this.

    0 讨论(0)
提交回复
热议问题