Estoy confundido en cuanto a lo que la mónada Put
ofrece sobre el uso de Builder
directamente, en Data.Binary
. Leí la sección Binary Generation de Tratar con datos binarios, y parece suponer que deberías usar Put
, pero es bastante corta y no explica por qué.ByteStrings en Haskell: ¿debería usar Put o Builder?
Data.Binary.Put
La mónada de venta. Una mónada para construir de manera eficiente cadenas de bytes perezosas.
type Put = PutM()
Ponga simplemente levanta el constructor en una mónada del escritor, se aplica a().
Data.Binary.Builder
la construcción eficiente de cadenas de bytes perezosas.
¿Cuál es el punto de una mónada Writer
aplicado a ()
?
puedo ver que es Put
(un tipo de sinónimos a) una mónada mientras que Builder
no es, pero yo realmente no entiendo por qué se necesitaría Put
.
En mi caso, renderizo una escena en 3D y escribo cada píxel como un 3 bytes, y luego agrego el encabezado del formato PPM al principio (usará PNG más adelante).
Parece que debe crearse una instancia para tipos que se pueden serializar y deserializar desde y hacia datos binarios. Esto no es exactamente lo que estoy haciendo, pero se sentía natural para crear instancias de Binary
para mi tipo de color
instance (Binary a) => Binary (Colour a) where
put (Colour r g b) = put r >> put g >> put b
get = Colour <$> get <*> get <*> get
Esto hace que sea fácil de put
un Colour Word8
en 24 bits. Pero luego también tengo que virar en el encabezado, y no estoy seguro de cómo debería hacerlo.
¿Está Builder
oculto entre bastidores o depende? ¿Es la clase Binary
solo para (de) serializar datos, o para todos los propósitos de generación binaria?
No es una respuesta, pero es posible que desee examinar el uso de blaze-builder (y amigos) en lugar de binario. –
@TiloWiklund: Lo había visto antes. ¿Qué tiene de diferente? ¿Es más eficiente? – mk12
Entre otras cosas. Hay una buena reseña de uno de los autores aquí: http://lambda-view.blogspot.se/2010/11/blaze-builder-library-faster.html –