52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 147

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 147

AppendMode – добавление (запись в конец файла)

ReadWriteMode – чтение и запись

Открыв дескриптор, мы можем начать обмениваться данными. Для этого определены функции аналогич-

ные тем, что мы уже рассмотрели. Функции для записи данных:

-- запись символа

hPutChar :: Handle -> Char -> IO ()

-- запись строки

hPutStr :: Handle -> String -> IO ()

-- запись строки с переносом каретки

hPutStrLn :: Handle -> String -> IO ()

-- запись значения

hPrint :: Show a => Handle -> a -> IO ()

Типичные задачи IO | 137

Все функции принимают первым аргументом дескриптор потока. Дескриптор должен позволять записы-

вать данные. Например для дескриптора, открытого в режиме ReadMode, выполнение этих функций приведёт

к ошибке.

Из потоков также можно читать данные. Эти функции похожи на те, что мы уже рассмотрели:

-- чтение одного символа

hGetChar :: Handle -> IO Char

-- чтение строки

hGetLine :: Handle -> IO String

-- ленивое чтение строки

hGetContents :: Handle -> IO String

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

Сделать это можно функцией hClose:

hClose :: Handle -> IO ()

Стандартные функции ввода/вывода, которые мы рассмотрели ранее определены через функции работы

с дескрипторами. Например так мы выводим строку на экран:

putStr

:: String -> IO ()

putStr s

=

hPutStr stdout s

А так читаем строку с клавиатуры:

getLine

:: IO String

getLine

=

hGetLine stdin

В этих функциях используются дескрипторы стандартных потоков данных stdin и stdout. Отметим функ-

цию withFile:

withFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO r

Она открывает файл в заданном режиме выполняет функцию на его дескрипторе и и закрывает файл.

Например через эту функцию определены функции readFile и appendFile:

appendFile

:: FilePath -> String -> IO ()

appendFile f txt = withFile f AppendMode (\hdl -> hPutStr hdl txt)

writeFile :: FilePath -> String -> IO ()

writeFile f txt = withFile f WriteMode (\hdl -> hPutStr hdl txt)

8.5 Форточка в мир побочных эффектов