Описание 98 Haskell вход основна операция

O - 7 Basic въвеждане експлоатация

система за влизане - O в Haskell е чисто функционално, но той има изразителна сила на конвенционалните програмни езици. За да се постигне това, Haskell използва монада за интегрирането на I - О в чисто функционален контекст.

Монада вход - изход Haskell използва като връзка между стойностите. присъщ функционален език и действия. характеризиращи работата на вход - изход и наложително програмиране като цяло. Процедура за изчисляване на изрази в Haskell ограничава само зависимости данни; изпълнение има значителна свобода при избора на тази цел. Действия, обаче, трябва да бъдат подредени по определен начин за изпълнение на програмата, и по-специално, вход - изход, за да бъдат тълкувани правилно. В Haskell Монада вход - изход предоставя на потребителя по начин, за да посочите серийния обвързващо действие и изпълнението изисква да се съобразят с настоящата поръчка.

О - 7.1 стандартния функции

Въпреки Haskell осигурява доста сложни средства за вход - изход, определени в библиотеката IO. Много програма Haskell може да се запише като се използват само няколко прости функции, които са изнесени от Прелюд и които са описани в този раздел.

Всички входни функции - О, описани тук, се занимават с букви. Обработка символ за нов ред ще бъде различна в различните системи. Например, две входни символи, връщане и нов ред, могат да се четат като един символ за нов ред. Тези функции не могат да се използват за двоичен вход в преносимите програми - О.

Освен това, се припомни, че String е синоним на [Чар] (раздел 6.1.2).

O функции

Тези функции са записани в стандартната изходното устройство (обикновено потребителски терминал).

putChar. Чар -> IO ()
putStr. String -> IO ()
putStrLn. String -> IO () - добавя нов ред
печат. Покажи по-=> а -> IO ()

Функцията за печат отпечатва стойността на всеки подходящ вид печат на стандартния изход. видове печат --- това са видове, които са копия на класа Покажи; печат превръща стойности в реда за изход от експлоатация шоуто. и добавя символ за нов ред.

Например, програмата на 20, за да отпечатате първите целочислени правомощията на 2 и може да се запише като:

Основната = печат ([(N, 2 ^ н) | п <- [0..19]])

опции за въвеждане

Тези функции четат данни от стандартната входно устройство (обикновено потребителски терминал).

getChar. IO Char
getLine. IO String
getContents. IO String
взаимодействат. (String -> String) -> IO ()
readIO. Прочетете => String -> IO на
readLn. Прочетете => IO на

getChar операция предизвиква изключение (раздел 7.3), когато признаците на края на файла, предикат isEOFError. която признава това изключение е дефинирано в библиотеката IO. getLine операция хвърля изключение при същите обстоятелства като hGetLine. дефиниран в библиотеката IO.

Операция getContents връща всички потребителски вход в низ, който се чете лениво, както е необходимо. взаимодействат функция може да отнеме като аргумент от тип String-> String функция. Всички данни от стандартната входно устройство се предава на тази функция като аргумент и получената низ се извежда на стандартния изход.

Обикновено клас чете от Read операция се използва за конвертиране на стойност низ. readIO функция е подобна на четене. с изключение на факта, че тя пречи на входа монада - изход грешка при анализа, вместо завършване на програмата. readLn функция съчетава getLine и readIO.

Следната програма просто премахва всички символи, различни от ASCII, от стандартния си вход и визуализира резултата на стандартния си изход. (IsAscii функция се определя в библиотеката.)

Основната = взаимодействат (филтър isAscii)

Тези функции работят характер файлове. Файлове, определени от редове с помощта на някои, в зависимост от изпълнението, метода на линии на резолюция като името на файла.

Функции writeFile и appendFile съответно записан или добавя към края на линията, втория си аргумент, във файл, първия си аргумент. функция ReadFile прочита файла и връща съдържанието на файла като низ. Файлът се чете лениво, при поискване, в getContents.

Типове FilePath = String

writeFile. FilePath -> String -> IO ()
appendFile. FilePath -> String -> IO ()
ReadFile. FilePath -> IO String

Имайте предвид, че writeFile и appendFile напиши буквално низа във файла. За да напишете стойността на всеки печат тип, както в печатен вид. шоу функция се използва за първи път да я превърне в стойността в низ.

Основните = appendFile "квадрати" (показват [(х, х * х) | х <- [0,0.1..2]])

О - 7.2 Последователните входни операции

Вид конструктор IO е инстанция на класа Монада. Две монадно 'свързващи функции, методи Монада клас. използвана за производство на последователности на I - О. Функция >> се използва, когато на първия резултат операция не представлява интерес, например, когато тя представлява (). Операция >> = предава резултата от първата операция през втората операция като аргумент.

(>> =). IO а -> (а -> IO б) -> IO б
(>>). IO е -> IO б -> IO б

Основната = ReadFile "входно-файл" >> = \ ите ->
writeFile "изход-файла" (филтър isAscii и) >>
putStr "Filtering успешен \ Н"

сходен с предишния пример с помощта си взаимодействат. но ще получи своя принос от страна на "входно-файла" и пише своята продукция на "изход-файл". Преди приключването на програмата на стандартно съобщение изход за печат.

нотация задачи позволява програмиране в по-наложително синтактично стил. Малко по-сложна версия на предишния пример ще бъде програма за:

Основните = направя
putStr "входен файл"
ifile <- getLine
putStr "Изходният файл:"
ofile <- getLine
ите <- readFile ifile
writeFile ofile (филтърни isAscii и)
putStr "Filtering успешен \ Н"

Функцията за връщане се използва за определяне на резултата от въвеждане на експлоатация - изход. Например, getLine определя от гледна точка getChar. Използването на връщане да се определи резултата:

getLine. IO String
getLine = направи в <- getChar
ако в == '\ Н "и след това се върнете" "
друго правя и <- getLine
върне (в: а)

7.3 Изключение Работа в Монада вход - изход

Монада вход - изход се състои от единна система обработка на изключения. Всяка дейност, вход - изход може да предизвика изключение вместо връщане на резултат.

Изключения в вход монада - изходните стойности са представени тип IOError. Това е абстрактно тип: неговите дизайнери са скрити от потребителя. IO библиотека дефинира функции, които конструират и изучават ценностите IOError. Единствената функция на Prelude, която създава стойност IOError. е userError. Стойности за грешки включват низ, описващ грешка.

userError. String -> IOError

Изключения са повдигнати и уловени с помощта на следните функции:

ioError. IOError -> IO на
хване. IO а -> (IOError -> IO а) -> IO на

функция ioError извиква изключение; функция улов определя манипулатор, който получава никакво изключение, причинени от действия, сигурна улов. Изключение е хванат от новата процесорна набор улов. Тези манипулатори не са селективни: те хване всички изключения. Разпределение на изключения трябва да бъде изрично предвидено в манипулатор чрез изземване нежелани изключения. Например, в

е = улов г (\ д -> ако IO.isEOFError д след това се връща [] друго ioError д)

връща е []. когато по изключение се случва в гр края на файла, в противен случай изключение премина към следващата външен манипулатор. isEOFError опция е част от библиотеката IO.

Когато по изключение се пренася извън основната програма, системата показва Haskell свързано стойност IOError и излиза от програмата.

провали метод например клас IO Монада (раздел 6.3.6) е userError, както следва:

Например Монада IO където
. автомати за връщане (>> =), (>>)

Fail S = ioError (userError и)

Изключения хвърлени входни функции - O в Prelude, описани в глава 21.