采用ByteString的子串的惯用法

时间:2013-05-31 03:47:19

标签: haskell bytestring

我需要广泛使用:

slice :: Int -> Int -> ByteString -> ByteString
slice start len = take len . drop start

两部分问题:

  1. 这已经有了名字吗?我找不到任何在Hoogle上搜索该类型的内容,但它似乎应该是一个非常普遍的需求。我还尝试搜索(Int, Int) -> ByteString -> ByteString及其flip个版本。我还尝试查找[a]版本以查看是否有常用的名称。
  2. 有没有更好的方式来写它?
  3. 我怀疑我做错了什么,因为我强烈期望找到很多人走上同一条路,但是我的google-fu找不到任何东西。

2 个答案:

答案 0 :(得分:8)

惯用法是通过takedrop,它在严格的字节串上具有 O(1)复杂性。

未提供

slice,以阻止对不安全的索引操作的依赖。

答案 1 :(得分:1)

根据文件,没有这样的功能。目前严格的ByteStrings是represented作为指向pinned memory的缩写,偏移量和长度的指针。所以,实际上,您的实现是更好的拼接方式。但是,您应该小心拼接,因为拼接的字节串占用与原始字节串相同的空间量。为了避免这种情况,你可能希望copy一个拼接的字节串,但这并不总是必需的。