【发布时间】:2012-07-16 20:49:12
【问题描述】:
我很困惑Put monad 在Data.Binary 中直接使用Builder 提供了什么。我阅读了处理二进制数据的Binary Generation 部分,似乎假设您应该使用Put,但它很短并不能解释原因。
Data.Binary.Put
Put 单子。用于高效构造惰性字节串的 monad。
type Put = PutM ()仅将 Builder 提升为 Writer monad,应用于 ()。
Data.Binary.Builder
懒惰字节串的高效构造。
Writer monad 应用于 () 有什么意义?
我可以看到 Put 是 monad(类型同义词),而 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 类仅用于(反)序列化数据,还是用于所有二进制生成目的?
【问题讨论】:
-
不是答案,但您可能想看看使用 blaze-builder(和朋友)而不是二进制文件。
-
@TiloWiklund:我以前见过。它有什么不同?效率更高吗?
-
除其他外。这里的一位作者写得很好:lambda-view.blogspot.se/2010/11/…
-
Binary类及其方法Get和Put本质上是用于序列化和反序列化Haskell 结构。如果您正在使用现有的二进制格式,最好(在我看来,当然)避免使用 Binary 类,而是使用putWord8、putWord32le等显式函数。 -
@stephentetley:我也是这么想的,但我不确定……至少对于颜色,使用
Put很方便,并且在语义上也有意义,但我不知道我是否应该将Put用于所有内容。
标签: haskell functional-programming monads binary-data