我正在尝试使用 http-simple 库开发一个 http 客户端。该库的某些实现对我来说似乎令人困惑。
这个库大量使用了 Conduit;但是还有这个“setRequestBodyLBS”函数,有趣的是,这里缺少“setRequestBodyBS”函数。据记载,Conduit 和惰性 IO 不能很好地协同工作。所以我的问题是,为什么不反过来呢?即,实现功能的BS版本而不是LBS版本?这里做出的选择背后的想法是什么?
在内部,惰性字节串就像严格字节串的链表。从一个严格的字节串转移到一个惰性的字节串很便宜(你建立一个元素的链表),但反过来会更昂贵(你需要为组合字节分配一块连续的内存,然后从名单)。
惰性 IO 使用惰性字节串,但它们在其他情况下也很有用,例如,当您有来自外部源的严格块并且您想要一种简单的方法来累积它们而不必预先分配大块内存或执行频繁的重新分配时/副本。相反,您只需保留稍后作为惰性字节串呈现的块列表。(当列表连接开始变得昂贵或粒度太小时,您可以使用 aBuilder
作为进一步的优化。)
另一个常见的用例是一些复合数据结构(例如 aeson's Value
)的序列化。如果您要做的只是将生成的字节转储到文件或网络请求中,那么对每个子组件的序列化字节执行相对昂贵的合并是没有多大意义的。如果需要,您可以随时在以后执行它toStrict
。