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

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

Мы получили ошибку. Мы пытаемся писать в файл, который уже занят для чтения. Дело в том, что функ-

ция readFile заняла файл, за счёт чтения по кусочкам. Для решения этой проблемы необходимо воспользо-

ваться энергичной версией функции readFile, она будет читать файл целиком. Эта функция живёт в модуле

System.IO.Strict:

import qualified System.IO.Strict as StrictIO

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

inFile fun file = writeFile file . fun =<< StrictIO. readFile file

Функция main осталась прежней. Теперь наша программа спокойно переворачивает текст файла.

Аргументы программы

Пока программы, которые мы создавали просили пользователя ввести данные вручную при выполнении

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

начальные данные, установки или флаги. Читать начальные данные можно с помощью функций из модуля

System.Environment.

Узнать, что передаётся в программу можно функцией getArgs :: IO [String]. Она возвращает список

строк. Это те строки, что мы написали за именем программы через пробел при вызове в терминале. Напишем

простую программу, которая распечатывает свои аргументы по порядку, в виде пронумерованного списка.

module Main where

import System.Environment

main = getArgs >>= mapM_ putStrLn . zipWith f [1 .. ]

where f n a = show n ++ ”: ” ++ a

В локальной функции f мы присоединяем к строке номер через двоеточие. Функцией mapM_ мы пробегаем

по списку строк, отображая их с помощью функции putStrLn. Обратите внимание на краткость программы,

с помощью функции композиции мы легко составили функцию, которая приписывает к аргументам числа, а

затем выводит их на экран.

Скомпилируем программу в интерпретаторе и вызовем её.

*Main> :! ghc --make Args

[1 of 1] Compiling Main

( Args. hs, Args. o )

Linking Args ...

*Main> :! ./Args hey hey hey 23 54 ”qwe qwe qwe” fin

1: hey

2: hey

3: hey

4: 23

5: 54

6: qwe qwe qwe

7: fin

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

С помощью функции getProgName можно узнать имя программы. Создадим программу, которая здоро-

вается при вызове. И отвечает в зависимости от настроения программы. Настроение задаётся аргументом

программы.

module Main where

import Control.Applicative

import System.Environment

main = putStrLn =<< reply <$> getProgName <*> getArgs

132 | Глава 8: IO

reply :: String -> [String] -> String

reply name (x:_) = hi name ++ case x of

”happy”

-> ”What a lovely day. What’s up?”