Я смущен тем, что монада Put
предлагает с помощью Builder
напрямую, в Data.Binary
. Я прочитал раздел Binary Generation в разделе "Работа с двоичными данными", и, похоже, вы должны использовать Put
, но он довольно короткий, t объясните почему.
Data.Binary.Put
Монаха Пута. Монада для эффективного построения ленивых байтов.
type Put = PutM ()
Поместите просто подъемник Builder в монадию писателя, применимую к().
Data.Binary.Builder
Эффективное построение ленивых байтовых строк.
Какова точка монады Writer
, примененной к ()
?
Я вижу, что Put
(синоним типа) монады, тогда как Builder
нет, но я действительно не понимаю, почему Put
понадобится.
В моем случае я представляю 3D-сцену и записываю каждый пиксель в виде 3 байтов, а затем добавляю заголовок формата PPM в начало (позже будет использовать PNG).
Binary
кажется, что он предназначен для создания экземпляров для типов, которые могут быть сериализованы и десериализованы в двоичные данные и из них. Это не совсем то, что я делаю, но было естественно создать экземпляр Binary
для моего типа цвета
instance (Binary a) => Binary (Colour a) where
put (Colour r g b) = put r >> put g >> put b
get = Colour <$> get <*> get <*> get
Это упрощает Put
a Colour Word8
до 24 бит. Но тогда я также должен придерживаться заголовка, и я не уверен, как это сделать.
Является ли Builder
скрытым за кулисами или зависит от этого? Является ли класс Binary
только для (де) сериализации данных или для всех целей генерации двоичных данных?