Как сказал @sclv в комментариях выше, ленивая строка байтов - это просто список строгих строк байтов.Существует два подхода к преобразованию отложенного ByteString в строгий (источник: обсуждение списка рассылки haskell о добавлении функции toStrict ) - соответствующий код из цепочки сообщений ниже:
Во-первых, соответствующие библиотеки:
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 в этих тестах.