8

我需要广泛使用:

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

两部分问题:

  1. 这已经有名字了吗?我在 Hoogle 上找不到任何搜索该类型的东西,但它似乎应该是一个非常普遍的需求。我还尝试搜索(Int, Int) -> ByteString -> ByteString和一些flip相同的版本。我还尝试寻找[a]版本以查看是否有常用名称。
  2. 有没有更好的写法?

我怀疑我做错了什么,因为我强烈希望能找到很多人走上同一条路,但我的 google-fu 没有找到任何东西。

4

2 回答 2

8

惯用的方法是 via takeand drop,它在严格的字节串上具有O(1)复杂度。

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

于 2013-05-31T07:24:08.223 回答
1

根据文档,没有这样的功能。目前,严格的 ByteStrings表示为指向固定内存开始的指针、偏移量和长度。因此,确实,您的实现是进行拼接的更好方法。但是,您应该小心拼接,因为拼接后的字节串占用的空间量与原始字节串相同。为了避免这种情况,您可能想要复制拼接的字节串,但这并不总是必要的。

于 2013-05-31T06:38:04.690 回答