Хорошо, я думаю, что вижу проблему здесь.Пакет vector-binary-instances определяет:
instance (Data.Vector.Generic.Base.Vector v a, Binary a) => Binary (v a)
, что очень плохо.Это определение означает «для любого типа« v a », это допустимый двоичный экземпляр».Это означает, что этот экземпляр доступен для любого типа , который соответствует 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
, что явно неверно.
Краткий ответ: не использоватьвектор-двоичные экземпляры на данный момент.Этот экземпляр не работает, и, учитывая, как экземпляры распространяются через код на Haskell, это вызовет проблемы.Пока это не исправлено, вы должны написать свои собственные двоичные экземпляры для векторов.Вы должны быть в состоянии скопировать код из vector-binary-instances и ограничить его мономорфным векторным типом
instance (Binary a) => Binary (Vector a) where
Я считаю, что это будет работать с любым Vector, который является экземпляром Data.Vector.Generic.Vector.
Вы также можете связаться с сопровождающим vector-binary-instances по этому поводу.