http-简单setRequestBodyLBS背后的哲学

时间:2018-08-16 13:39:52

标签: haskell conduit lazy-io

我正在尝试通过使用http-简单库来开发http客户端。该库的某些实现对我来说似乎很困惑。

该库大量使用了Conduit;但是,也有此“ setRequestBodyLBS”函数,有趣的是,这里没有函数“ setRequestBodyBS”。据记录,Conduit和惰性IO不能很好地协同工作。所以我的问题是,为什么不反过来呢?即实现该功能的BS版本而不是LBS版本?在这里做出选择背后的想法是什么?

1 个答案:

答案 0 :(得分:1)

在内部,惰性字节串就像是严格字节串的链表。移动from a strict bytestring to a lazy one很便宜(您可以建立一个元素的链表),但是移动reverse direction则比较昂贵(您需要为组合的字节分配一个连续的内存块,然后从中复制每个块列表)。

惰性IO使用惰性字节串,但是它们在其他情况下也很有用,例如,当您有来自外部源的严格块并且您想要一种简单的方法来累加它们而不必预先分配大的内存或执行频繁的重新分配/副本。取而代之的是,您只保留一个块列表,以后将它们present作为惰性字节串使用。 (当列表串联开始变得昂贵或粒度太小时,可以使用Builder作为进一步优化。)

另一个常见用例是对某些复合数据结构进行序列化(例如,aeson的Value)。如果您要做的只是将生成的字节转储到文件或网络请求中,那么对每个子组件的序列化字节执行相对昂贵的合并就没有多大意义了。如有需要,您以后随时都可以使用toStrict来执行它。