gpt4 book ai didi

haskell - Haskell 中的字节串 : should I use Put or Builder?

转载 作者:行者123 更新时间:2023-12-03 15:19:06 25 4
gpt4 key购买 nike

我对 Put 的内容感到困惑。 monad 提供了使用 Builder直接,在 Data.Binary .我读了Binary Generation处理二进制数据部分,似乎假设您应该使用 Put ,但它很短并不能解释原因。
数据.二进制.Put

The Put monad. A monad for efficiently constructing lazy bytestrings.

type Put = PutM ()

Put merely lifts Builder into a Writer monad, applied to ().


Data.Binary.Builder

Efficient construction of lazy byte strings.


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类仅用于(反)序列化数据,还是用于所有二进制生成目的?

最佳答案

首先注意概念上的差异。构建器用于高效构建字节串流,而 PutM monad 真的是为了序列化。所以你应该问自己的第一个问题是你是否真的在序列化(回答这个问题时问问你自己是否有一个有意义且完全相反的操作——反序列化​​)。

一般来说,我会选择 Builder为了它提供的方便。但是,不是 Builder来自二进制包,但实际上来自 blaze-builder 包。它是一个幺半群,并有许多预定义的字符串生成器。它也是非常可组合的。最后,它非常快,实际上可以进行微调。

最后但并非最不重要的一点是,如果您真的想要速度、便利和优雅的代码,您将希望将其与各种流处理器库之一结合起来,如管道、枚举器或管道。

关于haskell - Haskell 中的字节串 : should I use Put or Builder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com