Идиоматический способ взять подстроку ByteString

Мне нужно широко использовать:

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

Вопрос из двух частей:

  1. У этого уже есть название? Я не могу найти что-либо в поиске этого типа на Hoogle, но похоже, что это должно быть действительно общей потребностью. Я также пытался искать (Int, Int) -> ByteString -> ByteString и некоторые flip версии того же самого. Я также попытался найти [a] версии, чтобы узнать, есть ли общеупотребительное имя.
  2. Есть ли лучший способ написать это?

Я подозреваю, что делаю что-то не так, потому что я очень ожидал найти много людей, которые пошли по той же дороге, но мой гугл-фу ничего не нашел.


person Doug McClean    schedule 31.05.2013    source источник
comment
Это актуально: stackoverflow.com /вопросы/4597820/   -  person Daniel Gratzer    schedule 31.05.2013
comment
Спасибо jozefg. В одном из ответов упоминается slice :: Int -> Int -> Vector a -> Vector a, так что это прецедент для выбора имени.   -  person Doug McClean    schedule 31.05.2013
comment
Я почти уверен, что ваш путь идиоматичен (и лучше, чем связанный ответ). Это также самый эффективный способ (обе операции выполняются за O(1)).   -  person Gabriel Gonzalez    schedule 31.05.2013


Ответы (2)


Идиоматический способ — через take и drop, который имеет сложность O(1) для строгих байтовых строк.

slice не предоставляется, чтобы не полагаться на небезопасные операции индексирования.

person Don Stewart    schedule 31.05.2013
comment
Прямо изо рта лошади. Спасибо за работу над библиотекой и за ответ. - person Doug McClean; 31.05.2013

По документации такой функции нет. В настоящее время строгие ByteStrings: представлен как указатель на начало закрепленного память, смещение и длину. Итак, действительно, ваша реализация - лучший способ сделать сплайсинг. Однако вы должны быть осторожны со сплайсингом, потому что сплайсированные строки байтов занимают столько же места, сколько и исходные строки байтов. Чтобы избежать этого, вы можете копирует объединенную строку байтов, но это не всегда обязательно.

person Samvel Truzyan    schedule 31.05.2013