Самый простой метод выполнения ленивых операций ввода-вывода включает такие функции, как interact
, readFile
, hGetContents
и такие, как dons ;в книге Real World Haskell есть более подробное их обсуждение, которое может оказаться полезным.Если мне не изменяет память, все такие функции в конечном итоге реализуются с использованием unsafeInterleaveIO
, о котором упоминается ephemient , поэтому вы также можете создавать свои собственные функции таким образом, если хотите.
С другой стороны, было бы разумно отметить, что unsafeInterleaveIO
- это именно то, что написано на банке: небезопасный IO .Используя его - или функции на его основе - нарушает чистоту и ссылочную прозрачность .Это позволяет, по-видимому, чистым функциям (то есть, которые не возвращают действие IO
) воздействовать на внешний мир при оценке, давать разные результаты из одних и тех же аргументов и всех других неприятных вещей.На практике наиболее разумные способы использования unsafeInterleaveIO
не вызовут проблем, а простые ошибки обычно приводят к очевидным и легко диагностируемым ошибкам, но вы потеряли некоторые хорошие гарантии.
Существуют альтернативыкурс;в Hackage можно найти разные библиотеки, которые предоставляют ограниченные, безопасные, ленивые IO или концептуально разные подходы .Однако, учитывая, что проблемы возникают на практике лишь изредка, я думаю, что большинство людей склонны придерживаться встроенных, технически небезопасных функций.