我有一个函数,它接受一个列表,我希望返回strict ByteStrings
的列表(懒惰应该转移到输出的lazy ByteString
类型)。
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
csVals :: L.ByteString -> [B.ByteString]
我想这样做的原因有很多,several lexing functions需要严格的ByteString
s,我可以保证在上面的csVal
s的输出中输出的严格ByteString
s非常小。
在没有ByteString
**s [chunking](http://hackage.haskell.org/packages/archive/bytestring/latest/doc/html/Data-ByteString-Lazy.html#v:toChunks) them的情况下,我该如何对ByteString
**s进行“严格限制”?**
Update0
我想使用一个Lazy ByteString
,并创建一个包含其所有数据的严格ByteString
。
发布于 2011-12-18 23:27:52
就像@sclv在上面的评论中所说的,懒惰的字节串只是一个严格的字节串列表。有两种方法可以将懒惰的ByteString转换为严格的(来源:haskell mailing list discussion about adding toStrict function) -来自以下电子邮件线程的相关代码:
首先,相关的库:
import qualified Data.ByteString as B
import qualified Data.ByteString.Internal as BI
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Internal as BLI
import Foreign.ForeignPtr
import Foreign.Ptr
方法1(与@sclv相同):
toStrict1 :: BL.ByteString -> B.ByteString
toStrict1 = B.concat . BL.toChunks
方法2:
toStrict2 :: BL.ByteString -> B.ByteString
toStrict2 BLI.Empty = B.empty
toStrict2 (BLI.Chunk c BLI.Empty) = c
toStrict2 lb = BI.unsafeCreate len $ go lb
where
len = BLI.foldlChunks (\l sb -> l + B.length sb) 0 lb
go BLI.Empty _ = return ()
go (BLI.Chunk (BI.PS fp s l) r) ptr =
withForeignPtr fp $ \p -> do
BI.memcpy ptr (p `plusPtr` s) (fromIntegral l)
go r (ptr `plusPtr` l)
如果性能是一个问题,我建议查看上面的电子邮件线程。它也有标准基准。在这些基准测试中,toStrict2比toStrict1更快。
发布于 2012-11-30 02:16:48
现在,bytestring
包导出一个toStrict
函数:
这可能不是您想要的,但它肯定回答了本文标题中的问题:)
发布于 2011-10-19 14:30:42
如果所讨论的延迟ByteString是严格ByteString的最大大小的<=:
toStrict = fromMaybe SB.empty . listToMaybe . toChunks
toChunks
使每个块尽可能大(可能最后一个除外)。
如果惰性ByteString的大小大于严格ByteString的大小,那么这是不可能的:这正是惰性ByteStrings的用途。
https://stackoverflow.com/questions/7815402
复制相似问题