Используйте Data.Binary и один из производных скриптов, поставляемых с пакетом.
Это очень просто получить двоичные экземпляры, используя функции «получить» или «получить», предоставленные в наборе инструментов Data.Binay.
derive :: (Data a) => a -> String
Для любого «a» в Данных он получает двоичный экземпляр для вас в виде строки. Также есть версия putStr, производная от M.
Пример:
*Main> deriveM (undefined :: Drinks)
instance Binary Main.Drinks where
put (Beer a) = putWord8 0 >> put a
put Coffee = putWord8 1
put Tea = putWord8 2
put EnergyDrink = putWord8 3
put Water = putWord8 4
put Wine = putWord8 5
put Whisky = putWord8 6
get = do
tag_ <- getWord8
case tag_ of
0 -> get >>= \a -> return (Beer a)
1 -> return Coffee
2 -> return Tea
3 -> return EnergyDrink
4 -> return Water
5 -> return Wine
6 -> return Whisky
_ -> fail "no parse"
Пример, который вы приводите, является примером того, как выглядит сгенерированный машиной результат - да, это все биты на самом низком уровне! Не пишите это вручную - используйте инструмент, чтобы вывести его для вас через рефлексию.