Data.Vector.Binary перекрывает двоичный [a] экземпляр - PullRequest
7 голосов
/ 25 июля 2010

В моем приложении мне нужно сериализовать вектор, содержащий произвольный тип данных, в данном случае это список двойников.Для сериализации вектора я импортирую 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?Я просмотрел документацию, но не смог найти такой экземпляр.

Что я могу сделать, чтобы иметь возможность сериализовать эту структуру?

Редактировать:

Я использую следующееверсии пакета:

  • vector-0.6.0.2
  • vector-binary-instances-0.1.2
  • binary-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"

1 Ответ

7 голосов
/ 25 июля 2010

Хорошо, я думаю, что вижу проблему здесь.Пакет 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 по этому поводу.

...