我对Put
monad 提供的Builder
直接使用的内容感到困惑,在Data.Binary
. 我阅读了处理二进制数据的二进制生成部分,似乎假设您应该使用Put
,但它很短并没有解释原因。
数据.二进制.Put
Put 单子。用于有效构造惰性字节串的 monad。
type Put = PutM ()
只将 Builder 提升为 Writer monad,应用于 ()。
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
变成Colour Word8
24 位。但是我还必须添加标题,我不知道该怎么做。
是Builder
要隐藏在幕后,还是取决于?该类Binary
仅用于(反)序列化数据,还是用于所有二进制生成目的?