2013-05-31 15 views
7

ho bisogno di fare ampio uso di:modo idiomatico di prendere una stringa di un ByteString

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

due parte domanda:

  1. fa questo già un nome? Non riesco a trovare nulla che cerchi quel tipo su Hoogle, ma sembra che dovrebbe essere un'esigenza molto comune. Ho anche provato a cercare (Int, Int) -> ByteString -> ByteString e alcune versioni dello stesso flip. Ho anche provato a cercare le versioni [a] per vedere se c'era un nome in uso comune.
  2. C'è un modo migliore per scriverlo?

Sono sospettoso che sto facendo qualcosa di sbagliato perché mi aspettavo fortemente di trovare molte persone che hanno percorso la stessa strada, ma il mio google-fu non sta trovando nulla.

+0

Questo è rilevante: http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-i-e-python – jozefg

+1

Grazie jozefg. Una delle risposte menziona 'slice :: Int -> Int -> Vector a -> Vector a', quindi è un precedente per la scelta del nome. –

+2

Sono abbastanza sicuro che il tuo modo è il modo idiomatico (e migliore della risposta collegata). È anche il modo più efficiente (entrambe le operazioni sono O (1)). –

risposta

6

Il modo idiomatica è via take e drop, che ha O (1) complessità su rigorosi stringhe di byte.

slice non è fornito, per scoraggiare l'affidamento su operazioni di indicizzazione non sicure.

+0

Direttamente dalla bocca del cavallo. Grazie per il tuo lavoro in biblioteca e per la risposta. –

1

Secondo la documentazione non esiste tale funzione. Le ByteString attualmente severe sono represented come puntatore all'inizio di pinned memory, un offset e una lunghezza. Quindi, in effetti, la tua implementazione è un modo migliore di fare la giuntura. Tuttavia, si dovrebbe fare attenzione con le giunzioni perché le estensioni congiunte richiedono lo stesso spazio del test originale. Per evitare ciò, è possibile che si voglia eseguire il test di splicing da parte di copy, ma questo non è sempre necessariamente.

Problemi correlati