我想从字符串中删除尾随字符“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
对。
非延迟版本有一个解压缩函数,返回一对Bytestring
:
https://hackage.haskell.org/package/bytestring-0.10.8.1/docs/Data-ByteString-Char8.html#v:unzip
为什么懒人版没有类似的功能?
(请随意为我的共同修剪问题提出更好的解决方案。我希望有一些不太慢的东西。)
答案 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
从头开始将整个第一个字节串带入内存。