В Haskell, будет, называя длину на Ленивой силе ByteString всей строкой в память?

Я читаю большой поток данных с помощью ленивых строк байтов и хочу знать, доступны ли еще по крайней мере X байтов при парсинге его. Таким образом, я хочу знать, по крайней мере ли строка байтов X байты длиной.

Будет вызов length на нем приводят ко всему загружаемому потоку, следовательно побеждая цель использовать ленивую строку байтов?

Если бы да, то продолжение было бы: Как сказать, имеет ли это по крайней мере X байты, не загружая весь поток?

Править: Первоначально я спросил в контексте чтения файлов, но поймите, что существуют лучшие способы определить размер файла. Окончательное решение Te, в котором я нуждаюсь однако, не должно зависеть от ленивого источника строки байтов.

9
задан sth 28 July 2010 в 20:46
поделиться

4 ответа

Да.

длина. возьмите x .

11
ответ дан 3 November 2019 в 00:00
поделиться

Есть ли причина вы не используете hFileSize :: Handle -> IO Integer для получения длины файла?

1
ответ дан 3 November 2019 в 00:00
поделиться

РЕДАКТИРОВАТЬ: извините. Думаю, я думал, что строки байтов - это списки. Для строк байтов нет genericLength.

length является строгим, поскольку тип, который он возвращает Int , является строгим. Вы можете использовать genericLength из Data.List и импортировать библиотеку, которая определяет ленивые числа Пеано и предоставляет для них экземпляр Num, например, библиотеку чисел :

Это позволит вам выразите свою функцию так, как вы хотите, но ответ ephemient функционально тот же и не требует импорта новой библиотеки.

Я только что написал здесь сообщение в блоге на эту тему, если это похоже на подход, который может вас заинтересовать:

http://coder.bsimmons.name/blog/2010/03/lazy-arithmetic-in -haskell /

0
ответ дан 3 November 2019 в 00:00
поделиться

Он должен будет перебрать всю строку, но если вы не сохраните ссылку на всю ленивую байтовую строку где-либо еще, я считаю, что он сможет освободить головку строки, когда она продвигается к ее хвосту. .

0
ответ дан 3 November 2019 в 00:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: