で直接Put
使用するよりもモナドが提供するものについて混乱しています。Dealing with Binary dataのBinary Generationセクションを読みました。Builder
Data.Binary
Put
Data.Binary.Put
Put モナド。遅延バイト文字列を効率的に構築するためのモナド。
type Put = PutM ()
Put は単に Builder を Writer モナドにリフトし、() に適用します。
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
これにより、簡単に 24 ビットに変換put
できます。Colour Word8
しかし、ヘッダーも追加する必要があり、どうすればよいかわかりません。
Builder
舞台裏に隠されることを意図していますか、それとも依存していますか? このクラスは、Binary
データのシリアル化 (非) 化のみを目的としていますか、それともすべてのバイナリ生成を目的としていますか?