Descriere 98 Haskell intrării de operare de bază

O - 7 bază de intrare de operare

sistem de intrare - O în Haskell este pur funcțional, dar are puterea expresivă de limbaje de programare convenționale. Pentru a realiza acest lucru, Haskell folosește o monadă pentru integrarea I - O într-un context pur funcțional.

Monada de intrare - ieșire Haskell folosit ca o legătură între valorile. limbaj funcțional inerente și acțiuni. ce caracterizează funcționarea intrare - ieșire și programarea imperativă, în general. Procedura de calculare a expresiilor în Haskell limitate numai dependențe de date; punerea în aplicare a libertate considerabilă în alegerea acestei comenzi. Acțiuni, cu toate acestea, trebuie să fie aranjate într-un anumit fel pentru punerea în aplicare a programului și, în special, de intrare - ieșire, pentru a fi interpretate corect. În Haskell de intrare Monada - ieșire oferă utilizatorului o modalitate de a specifica acțiunea de legare în serie, și punerea în aplicare necesare pentru a se conforma acestui ordin.

O - 7.1 Funcții de intrare standard

Deși Haskell oferă mijloace destul de sofisticate de intrare - ieșire, definite în biblioteca IO. Multe un program de Haskell poate fi scris folosind doar câteva funcții simple, care sunt exportate din Preludiu și care sunt descrise în această secțiune.

Toate funcțiile de intrare - O, descrise aici sunt de-a face cu caractere. Prelucrarea newline vor fi diferite în diferite sisteme. De exemplu, două caractere de intrare, transportul retur și linie de alimentare, poate fi citit ca un singur caracter NEWLINE. Aceste funcții nu pot fi folosite pentru o intrare binară în programe portabile - O.

În plus, amintim că șirul este sinonim [Char] (secțiunea 6.1.2).

funcţii O

Aceste funcții sunt înregistrate în dispozitivul standard de ieșire (de obicei, un terminal de utilizator).

putchar. Char -> IO ()
putStr. String -> IO ()
putStrLn. String -> IO () - adaugă o linie nouă
imprimare. Arată a => a -> IO ()

Funcția de imprimare imprimă valoarea oricărui tip adecvat de imprimare la iesirea standard. Tipuri de printabile --- acestea sunt tipurile care sunt instanțe de clasă A arata; imprimare convertește valori în rândul pentru ieșire de spectacol operație. și adaugă un caracter NEWLINE.

De exemplu, programul 20 pentru a imprima primele puteri întregi de 2 și poate fi scrisă ca:

principal = print ([(n, 2 ^ n) | n <- [0..19]])

opţiuni de intrare

Aceste funcții citesc date de la un dispozitiv standard de intrare (de obicei, un terminal de utilizator).

getchar. IO Char
getline. IO String
getContents. IO String
interacționa. (String -> String) -> IO ()
readIO. Citirea unui => String -> IO o
readln. Citirea unui => IO o

operațiune getchar determină o excepție (punctul 7.3), în cazul în care semnele sfârșitului de fișier, un predicat isEOFError. care recunoaște această excepție este definită în bibliotecă IO. operațiune getline aruncă o excepție în aceleași condiții ca și hGetLine. definite în bibliotecă IO.

Operațiunea getContents returnează toate datele introduse de utilizator într-un șir de caractere care se citește alene după cum este necesar. interactioneaza functie are ca argument al funcției de tip String> String. Toate intrare de la dispozitivul standard de intrare este trecut la această funcție ca argument, iar șirul rezultat este de ieșire la ieșirea standard.

De obicei clasa citit de citire operație este utilizată pentru a converti o valoare șir. Funcția readIO este similară pentru a citi. cu excepția faptului că acesta împiedică intrarea monadă - ieșire de eroare de analiză, în loc de terminarea programului. Funcția readln combină getline și readIO.

Programul următor elimină pur și simplu toate celelalte decât caracterele ASCII, de la intrarea standard și afișează rezultatul pe ieșirea standard. (Funcția IsAscii este definită în bibliotecă.)

principal = interacționare (isAscii filtru)

Aceste funcții funcționează fișiere de caractere. Fișierele specificate de rânduri, folosind unele, în funcție de punerea în aplicare, metoda de linii de rezolutie ca nume de fișier.

Funcții WriteFile și appendFile, respectiv, înregistrate sau adăugate la sfârșitul liniei, al doilea argument, într-un dosar, primul argument. Funcția readfile citește fișierul și returnează conținutul fișierului ca un șir de caractere. Fișierul este citit alene, la cerere, în getContents.

tip filepath = String

WriteFile. Filepath -> String -> IO ()
appendFile. Filepath -> String -> IO ()
readfile. FILEPATH -> IO String

Rețineți că WriteFile și appendFile scrie un literal șir în fișier. Pentru a scrie valoarea oricărui tip de imprimat in imprimare. spectacol funcție este mai întâi folosit pentru a transforma valoarea într-un șir de caractere.

principale = appendFile "pătrate" (spectacol [(x, x * x) | x <- [0,0.1..2]])

O - 7.2 operații de intrare succesive

Tipul de constructor IO este o instanta a clasei Monada. Două funcții de legare monadice, metode Monada de clasă. utilizate pentru producerea de secvențe I - O. Funcția >> este utilizat în cazul în care primul rezultat de funcționare nu este de interes, de exemplu, atunci când aceasta reprezintă o (). Operațiunea >> = transmite rezultatul primei operațiuni, în a doua operație ca argument.

(= >>). IO a -> (a -> IO b) -> IO b
(>>). IO a -> IO b -> IO b

principal = readfile "input-file" >> = \ s ->
WriteFile "output-fișier" (filtru isAscii s) >>
putStr "Filtrarea de succes \ n"

similar cu exemplul anterior folosind interacționare. dar primește intrarea sa de la „intrare-fișier“ și scrie producția sa de „ieșire-fișier“. Înainte de finalizarea programului în mesajul de ieșire standard de imprimare.

Notația do permite programarea într-un stil sintactic mai imperativă. versiune ușor mai complexă din exemplul anterior ar fi un program de:

principale = do
putStr „fișier de intrare“
iFile <- getLine
putStr „fișier de ieșire:“
ofile <- getLine
s <- readFile ifile
WriteFile ofile (isAscii filtru s)
putStr "Filtrarea de succes \ n"

Funcția de retur este folosită pentru a determina rezultatul intrărilor de funcționare - ieșire. De exemplu, getline definit în termeni getchar. Utilizarea de retur pentru a determina rezultatul:

getline. IO String
getline = do c <- getChar
în cazul în care c == '\ n' apoi să se întoarcă ""
altceva s <- getLine
întoarce (c: s)

Manipularea 7.3 Excepție în intrare Monada - ieșire

Monada de intrare - ieșire cuprinde un singur sistem de manipulare excepție. Orice operațiune de intrare - ieșire poate ridica o excepție în loc de a se întoarce un rezultat.

Excepții în intrarea monadă - valorile de ieșire sunt prezentate tip IOError. Acesta este un tip abstract: designerii sale sunt ascunse de utilizator. IO bibliotecă definește funcțiile care construiesc și studiază valorile IOError. Singura funcție a Preludiu, care creează valoare IOError. este userError. Valorile de eroare personalizate includ un șir de caractere care descrie o eroare.

userError. String -> IOError

Excepțiile sunt ridicate și capturate folosind următoarele funcții:

IOError. IOError -> IO o
captura. IO a -> (IOError -> IO a) -> IO o

Funcția IOError ridică o excepție; Funcția de captură setează handler care primește orice excepție cauzată de acțiune, captura securizată. Excepția este prins de cel mai recent procesor de captură stabilite. Aceste stivuitoare nu sunt selective: ele prind toate excepțiile. Distribuția de excepții trebuie să fie furnizate în mod explicit în handler de rechemare orice excepții nedorite. De exemplu, în

f = captura g (\ e -> dacă IO.isEOFError e reveni apoi [] altceva IOError e)

Funcția returnează f []. când o excepție are loc în g capăt al fișierului, altfel excepția a trecut la următoarea tratare exterior. caracteristică isEOFError este parte a bibliotecii IO.

Atunci când o excepție este transferată în afara programului principal, sistemul afișează valoarea asociată Haskell IOError și iese din program.

nu metodă exemplu Clasa IO Monadă (secțiunea 6.3.6) este userError după cum urmează:

exemplu, în cazul în care Monada IO
. legături pentru întoarcere, (= >>), (>>)

Fail s = IOError (userError s)

Excepții aruncat funcții de intrare - O în Preludiu, descrisă în capitolul 21.