Определение сохраняемого экземпляра для типов данных объединения - PullRequest
1 голос
/ 09 декабря 2011

Как определить экземпляр хранимого вектора для типа данных, как показано ниже (состоит из примитивных типов GHC):

data Atoms =  I GHC.Int.Int32|S GHC.Int.Int16 -- define a union data type

Я проверил этот хранимый учебник , но он работает только для векторов тех же типов, а не для объединения, как описано выше.

1 Ответ

4 голосов
/ 09 декабря 2011

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

Например, вы можете добавить байт, который указывает индекс использованного конструктора.Это означает, что приведенные выше значения могут быть сохранены следующим образом:

Haskell    Binary
I 3     -> 00 00 00 00 03
S 4     -> 01 00 04 XX XX
              ^ Data
           ^ Constructor index
XX = unused byte

Затем, когда вы хотите десериализовать значение из строки байтов, вы просматриваете первый байт, смотрите, какой это индекс, и выбираетеоснованный на этом конструктор (и что посмотреть дальше)

...