2013-05-31 35 views
7

我需要做大量使用的一個子:慣用的方式,採取一個字節串

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

問題的兩個部分:

  1. 這是否已經有名字嗎?我無法在Hoogle上找到任何類型的搜索,但它似乎應該是一個非常普遍的需求。我也試過搜索(Int, Int) -> ByteString -> ByteString和一些flip的d版本。我也試過尋找[a]版本來查看是否有一個常用名字。
  2. 有沒有更好的方法來寫它?

我很懷疑自己做錯了什麼,因爲我強烈期望找到很多人走上了同一條路,但我的谷歌搜索沒有找到任何東西。

+0

這是相關的:http://stackoverflow.com/questions/4597820/does-haskell-have-list-slices-i-e-python – jozefg

+1

謝謝jozefg。其中一個答案提到'slice :: Int - > Int - > Vector a - > Vector a',這是名稱選擇的先例。 –

+2

我很確定你的方式是慣用的方式(並且比鏈接的答案更好)。這也是最有效的方式(兩種操作都是O(1))。 –

回答

6

這種慣用的方式是通過takedrop,它具有O(1)在嚴格字節串上的複雜性。

slice不提供,以阻止對不安全索引操作的依賴。

+0

直接從馬的嘴巴。感謝您在圖書館的工作和答案。 –

1

根據文檔沒有這樣的功能。目前嚴格的ByteStrings是represented作爲指向pinned memory開始的指針,偏移量和長度。所以,的確,你的實現是更好的拼接方法。但是,由於拼接的字節串與原始字節串具有相同的空間量,因此應該小心拼接。爲了避免這種情況,你可能想要copy拼接字節串,但這並不總是必然的。

相關問題