Данные.Вектор.Бинарные Бинарные дублирование [а] экземпляр


В моем приложении мне нужно сериализовать вектор, содержащий произвольный тип данных, в данном случае это список двойников. Для сериализации вектора я импортирую данные.Вектор.Двоичный.

При загрузке модуля в 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

Является ли список экземпляром вектора? Я просмотрел документацию, но не смог найти такого экземпляра.

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

Правка:

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

  • вектор-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"
1 7

1 ответ:

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

Краткий ответ: пока не используйте векторные двоичные экземпляры. Этот экземпляр сломан, и, учитывая, как экземпляры распространяются через код Хаскелла, это вызовет проблемы. Пока это не исправлено, вы должны написать свои собственные двоичные экземпляры для векторов. Вы должны иметь возможность скопировать код из векторных двоичных экземпляров и ограничить его мономорфным векторным типом

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

Я полагаю, что это будет работать с любым вектором, который является примером Данные.Вектор.Родовой.Вектор.

Вы также можете связаться с сопровождающим vector-binary-instances по этому поводу.