为什么Haskell Data.ByteString.Lazy.Char8没有解压缩功能?

时间:2017-02-14 17:13:13

标签: haskell text-processing

我想从字符串中删除尾随字符“T”,同时将相关字符串缩短从第一个字符串中删除的相同字符数。

我尝试如下:

{-# 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对。

非延迟版本有一个解压缩函数,返回一对Bytestringhttps://hackage.haskell.org/package/bytestring-0.10.8.1/docs/Data-ByteString-Char8.html#v:unzip

为什么懒人版没有类似的功能?

(请随意为我的共同修剪问题提出更好的解决方案。我希望有一些不太慢的东西。)

1 个答案:

答案 0 :(得分: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')

...不会在恒定的记忆中运行。 (顺便说一下,jberryman提到的现有Data.ByteString.Lazy.unzip也是如此。)

P.S。:在任何情况下,我都不确定在这种情况下,懒惰的字节串是否真的会让你获得更多,因为last . C.group从头开始将整个第一个字节串带入内存。