就像@sclv 在上面的评论中所说,惰性字节串只是严格字节串的列表。有两种方法可以将惰性 ByteString 转换为严格(来源:关于添加 toStrict 函数的haskell 邮件列表讨论)- 来自以下电子邮件线程的相关代码:
一、相关库:
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
方法二:
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 快。