2013-05-31 1 views
7

мне нужно широко использовать:Идиоматические способ взять подстроку байтовой строки

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

Две части вопроса:

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

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

+0

Это актуально: http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-i-e-python – jozefg

+1

Thanks jozefg. В одном из ответов там упоминается 'slice :: Int -> Int -> Vector a -> Vector a', поэтому это является прецедентом для выбора имени. –

+2

Я уверен, что ваш путь - это идиоматический путь (и лучше, чем связанный ответ). Это также самый эффективный способ (обе операции - O (1)). –

ответ

6

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

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

+0

Прямо из уст лошади. Спасибо за вашу работу в библиотеке и за ответ. –

1

В соответствии с документацией такой функции нет. В настоящее время строгие байтовые строки: represented в качестве указателя на начало pinned memory, смещение и длину. Итак, ваша реализация - лучший способ сделать сращивание. Тем не менее, вы должны быть осторожны с сращиваниями, потому что сплайсинг bytestrings занимает такое же пространство, что и исходное значение bytestring. Чтобы этого избежать, вы можете захотеть copy сращивать bytestring, но это не всегда обязательно.