【问题标题】:Idiomatic way to take a substring of a ByteString获取 ByteString 的子字符串的惯用方式
【发布时间】:2013-05-26 19:29:27
【问题描述】:

我需要大量使用:

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

两部分问题:

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

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

【问题讨论】:

  • 谢谢 jozefg。那里的答案之一提到了slice :: Int -> Int -> Vector a -> Vector a,因此这是名称选择的先例。
  • 我很确定您的方式是惯用的方式(并且比链接的答案更好)。这也是最有效的方式(两个操作都是 O(1))。

标签: haskell bytestring


【解决方案1】:

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

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

【讨论】:

  • 直接从马嘴里。感谢您在图书馆的工作和回答。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 2014-12-13
    • 2023-03-04
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2020-11-27
    相关资源
    最近更新 更多