我正在使用惰性字节串读取一个大数据流,并且想知道在解析它时是否至少还有 X 个字节可用。也就是说,我想知道字节串是否至少有 X 个字节长。
调用length
它会导致整个流被加载,从而破坏使用惰性字节串的目的吗?
如果是,那么后续将是:如何在不加载整个流的情况下判断它是否至少有 X 个字节?
编辑:最初我在阅读文件的情况下询问,但了解有更好的方法来确定文件大小。但是,我需要的最终解决方案不应依赖于惰性字节串源。
我正在使用惰性字节串读取一个大数据流,并且想知道在解析它时是否至少还有 X 个字节可用。也就是说,我想知道字节串是否至少有 X 个字节长。
调用length
它会导致整个流被加载,从而破坏使用惰性字节串的目的吗?
如果是,那么后续将是:如何在不加载整个流的情况下判断它是否至少有 X 个字节?
编辑:最初我在阅读文件的情况下询问,但了解有更好的方法来确定文件大小。但是,我需要的最终解决方案不应依赖于惰性字节串源。
是的。
length . take x
.
您是否有理由不使用hFileSize :: Handle -> IO Integer
来获取文件的长度?
它必须迭代整个字符串,但是如果您不在其他任何地方保留对整个惰性字节字符串的引用,我相信它应该能够在字符串的头部向其尾部前进时释放它。
编辑:对不起。我想我在想字节串是列表。字节串没有 genericLength。
length
是严格的,因为它返回的类型Int
是严格的。您可以genericLength
从 Data.List 使用并导入一个定义惰性 Peano 数字并为您提供 Num 实例的库,例如numbers库:
这会让你以你想要的方式表达你的功能,但 ehemient 的答案在功能上是相同的,并且不需要导入新的库。
我刚刚在这里发表了一篇关于该主题的博客文章,如果这听起来像是您可能感兴趣的一种方法:
http://coder.bsimmons.name/blog/2010/03/lazy-arithmetic-in-haskell/