2017-02-14 60 views
2

我想刪除字符串中的尾隨字符'T',同時用與第一個字符串相同的字符數來縮短關聯的字符串。爲什麼Haskell Data.ByteString.Lazy.Char8沒有解壓縮函數?

我試過如下:

{-# LANGUAGE OverloadedStrings #-} 
import qualified Data.ByteString.Lazy.Char8 as C 
zipTrim s q 
    | C.null s = (C.empty, C.empty) 
    | C.head (last $ C.group s) == 'T' = 
     unzip (C.zip (C.concat $ init $ C.group s) q) 
    | otherwise = (s, q) 

然而,unzip返回我一雙[Char],而不是一對Bytestring

的非懶版本有一個返回一對Bytestring一個解壓縮功能: https://hackage.haskell.org/package/bytestring-0.10.8.1/docs/Data-ByteString-Char8.html#v:unzip

爲什麼沒有懶惰的版本類似的功能?

(隨時提出對我的合作修剪問題更好的解決方案。我想有一些不算太慢。)

+2

也許是因爲懶惰的字節串是如何懶惰並不是很清楚。您可以將嚴格的字節串轉換爲懶惰的字節串。 –

+1

可能沒有什麼好的理由;我猜想有人忘了。 http://hackage.haskell.org/package/bytestring-0.10.8.1/docs/src/Data-ByteString-Lazy.html#unzip – jberryman

回答

2

乍一看,unzip懶人字節串歸結爲兩個半使用pack一對「字節」列表:

import Data.Bifunctor 
import qualified Data.ByteString.Lazy.Char8 as C 

unzipLazy :: [(Char, Char)] -> (C.ByteString, C.ByteString) 
unzipLazy = bimap C.pack C.pack . unzip 

,可以抓住你措手不及,雖然 - 如裏德巴頓指出,「[它不是]很清楚懶字節字符串如何偷懶[是]」。例如,這...

print . fst . unzipLazy $ repeat ('a', 'b') 

...不在恆定內存中運行。 (順便說一下,同樣的情況與現有Data.ByteString.Lazy.unzip是jberryman提到。)

PS:在任何情況下,我不知道,如果偷懶字節串實際上得到你很多在這種情況下,爲last . C.group帶來整個第一字節字符串從一開始就進入記憶。

相關問題