Вы должны закодировать, какой конструктор вы использовали для создания экземпляра типа.
Например, вы можете добавить байт, который указывает индекс использованного конструктора.Это означает, что приведенные выше значения могут быть сохранены следующим образом:
Haskell Binary
I 3 -> 00 00 00 00 03
S 4 -> 01 00 04 XX XX
^ Data
^ Constructor index
XX = unused byte
Затем, когда вы хотите десериализовать значение из строки байтов, вы просматриваете первый байт, смотрите, какой это индекс, и выбираетеоснованный на этом конструктор (и что посмотреть дальше)