Я смущен тем, что монада 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 только для (де) сериализации данных или для всех целей генерации двоичных данных?