Я читаю большой поток данных с помощью ленивых строк байтов и хочу знать, доступны ли еще по крайней мере X байтов при парсинге его. Таким образом, я хочу знать, по крайней мере ли строка байтов X байты длиной.
Будет вызов length
на нем приводят ко всему загружаемому потоку, следовательно побеждая цель использовать ленивую строку байтов?
Если бы да, то продолжение было бы: Как сказать, имеет ли это по крайней мере X байты, не загружая весь поток?
Править: Первоначально я спросил в контексте чтения файлов, но поймите, что существуют лучшие способы определить размер файла. Окончательное решение Te, в котором я нуждаюсь однако, не должно зависеть от ленивого источника строки байтов.
Есть ли причина вы не используете hFileSize :: Handle -> IO Integer
для получения длины файла?
РЕДАКТИРОВАТЬ: извините. Думаю, я думал, что строки байтов - это списки. Для строк байтов нет genericLength.
length
является строгим, поскольку тип, который он возвращает Int
, является строгим. Вы можете использовать genericLength
из Data.List и импортировать библиотеку, которая определяет ленивые числа Пеано и предоставляет для них экземпляр Num, например, библиотеку чисел :
Это позволит вам выразите свою функцию так, как вы хотите, но ответ ephemient функционально тот же и не требует импорта новой библиотеки.
Я только что написал здесь сообщение в блоге на эту тему, если это похоже на подход, который может вас заинтересовать:
http://coder.bsimmons.name/blog/2010/03/lazy-arithmetic-in -haskell /
Он должен будет перебрать всю строку, но если вы не сохраните ссылку на всю ленивую байтовую строку где-либо еще, я считаю, что он сможет освободить головку строки, когда она продвигается к ее хвосту. .