【发布时间】:2011-12-10 13:15:58
【问题描述】:
我有一个接受lazy ByteString 的函数,我希望有strict ByteStrings 的返回列表(懒惰应该转移到输出的列表类型)。
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
csVals :: L.ByteString -> [B.ByteString]
出于各种原因我想这样做,several lexing functions require strict ByteStrings,我可以保证上面csVals 的输出中输出的 strict ByteStrings 很小。
如果没有chunking 他们,我该如何“严格”ByteStrings?
更新0
我想要一个 Lazy ByteString,并制作一个包含所有数据的严格 ByteString。
【问题讨论】:
-
toChunks有什么问题?乍一看,它似乎保留了懒惰。 -
@Matt Joiner:也许你应该自己写一个词法分析,或者使用 DeepSeq 强制评估结果。
-
@Matt Joiner:同一个包中有一个 Lazy 版本:'Data.ByteString.Lex.Lazy.Double'。
-
@Matt Joiner:所以你想要指定大小的块?可能重复调用 splitAt?请注意,toChunks 生成严格的 ByteString 具有最大大小(可能最后一个除外)。
-
这里有一个误解——惰性字节串 is 本质上只是一个块列表(即严格的字节串)。
toChunks公开了该结构。要将列表全部放在一个严格的字节串中,除了concat . toChunks(或等效项)之外别无他法。在许多典型情况下,列表将只有一个元素——在这些情况下,concat . toChunks也会相对有效。
标签: haskell lazy-evaluation strict bytestring chunking