2013-05-31 17 views
7

muszę dokonać szerokie zastosowanie:Idiomatic sposób podjąć podciąg o ByteString

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

dwuczęściowego pytanie:

  1. Czy to już ma imię? Nie mogę znaleźć niczego, czego szukałbym w Hoogle, ale wygląda na to, że powinno to być naprawdę powszechną potrzebą. Próbowałem również poszukać (Int, Int) -> ByteString -> ByteString i niektórych wersji tego samego . Próbowałem również szukać wersji [a], aby sprawdzić, czy istnieje nazwa powszechnie używana.
  2. Czy istnieje lepszy sposób na zapisanie go?

Jestem podejrzliwy, że robię coś złego, ponieważ mocno oczekiwałem, że znajdę wiele osób, które poszły tą samą drogą, ale moje google-fu niczego nie znajduje.

+0

Jest to istotne: http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-i-e-python – jozefg

+1

Dzięki jozefg. Jedna z odpowiedzi wspomina o 'slice :: Int -> Int -> Vector a -> Vector a', co jest precedensem dla wyboru nazwy. –

+2

Jestem prawie pewien, że twoja droga jest idiomatyczna (i lepsza niż połączona odpowiedź). Jest to również najbardziej efektywny sposób (obie operacje to O (1)). –

Odpowiedz

6

idiomatycznym sposobem jest poprzez take i drop, który ma O (1) złożoność na ścisłym bytestrings.

slice nie jest dostarczany, aby zniechęcić do polegania na niebezpiecznych operacjach indeksowania.

+0

Prosto z ust konia. Dziękuję za pracę nad biblioteką i za odpowiedź. –

1

Zgodnie z dokumentacją nie ma takiej funkcji. Obecnie ścisłe ByteStrings są represented jako wskaźnik do początku pinned memory, przesunięcie i długość. Rzeczywiście, twoja implementacja jest lepszym sposobem na splatanie. Należy jednak zachować ostrożność w przypadku splotów, ponieważ splicowane próbki testowe zajmują taką samą ilość miejsca, co oryginalny test porównawczy. Aby tego uniknąć, możesz chcieć copy spliced ​​bytestring, ale nie zawsze jest to konieczne.