Чтение текстового файла

Haskell:
Чтение текстового файла

Как это сделать:

Вот как заставить Haskell читать текстовые файлы, не потея. Откройте ваш любимый редактор, и давайте писать код.

import System.IO

main = do
    -- Открываем файл в режиме чтения
    handle <- openFile "hello.txt" ReadMode
    -- Читаем содержимое файла
    content <- hGetContents handle
    -- Печатаем содержимое файла
    putStrLn content
    -- Не забываем закрыть дескриптор файла!
    hClose handle

Запустите это, и если у вас есть “hello.txt” с “Hello, World!” внутри, вы получите:

Hello, World!

Вот более короткий и изящный способ, делающий то же самое, но без лишних хлопот:

-- 'readFile' открывает и читает одним махом
main = do
    content <- readFile "hello.txt"
    putStrLn content

Выходные данные все те же,

Hello, World!

Погружение

Давным-давно программы были асоциальными существами, в основном обрабатывающими данные, которые они сами же и генерировали. Но со временем сложность возросла, как и необходимость привлекать внешнюю информацию, так что чтение из файлов стало обыденным делом.

Haskell предлагает различные способы чтения файлов. Мы можем делать это низкоуровневым способом с помощью openFile, hGetContents и hClose или действовать проще с readFile, который аккуратно все упаковывает.

readFile - ленивый; он читает содержимое по мере необходимости, что эффективно по памяти для больших файлов, но может привести к сюрпризам, если файл изменяется посреди работы. Низкоуровневый подход дает больше контроля, делая его более предсказуемым, но также и более многословным. Для гигантских текстов помогают управлять памятью и обработкой более тонко такие функции Haskell, как hGetLine, или библиотеки вроде conduit и pipes.

Стандартные IO действия Haskell обращаются с файлами, используя механизмы базовой ОС. Библиотеки абстрагируют это в более удобные для пользователя операции, но в конечном счете они построены на основе IO монады Haskell, что обеспечивает выполнение действий в правильном порядке.

Смотрите также