我对Putmonad 提供的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 Word824 位。但是我还必须添加标题,我不知道该怎么做。
是Builder要隐藏在幕后,还是取决于?该类Binary仅用于(反)序列化数据,还是用于所有二进制生成目的?