Описание 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.