Funcii i aritmetic [611453]
C1
Func]ii [i aritmetic\
Despre: c=teva `ntreb\ri pe care vi le pune]i atunci c=nd aborda]i un
nou limbaj, tipurile de date (arhi)cunoscute din alte limbaje, Tipurile
compuse, liste [i perechi, operatorii (opera]iile), Func]iile, func]ia
increment, Rularea unui program, variabilele folosite la signaturile
func]iilor [i semnul ->
R\spundem `n acest capitol la c=teva `ntreb\ri pe care vi le pune]i
atunci c=nd aborda]i un nou limbaj. Haskell 98 este un limbaj func]
ional pur, dar `n care se poate programna [i `n stil imperativ (vom
vedea c\ se folose[te o no]iune care a f\cut mult\ v=lv\ `n lumea
matematicienilor, monada – de fapt o anumit\ structur\ algebric\). ~n
Haskell 98 exist\ de asemenea o serie de no]iuni specifice program\rii
orientate obiect cum ar fi clas\, instan]\ a unei clase etc. Func]iile,
vom vedea, sunt polimorfice. Se pot descrie u[or de tot liste [i arbori,
reuniuni de tipuri ba chiar mul]imi ordonate [i liste infinite. (Interesant,
nu-i a[a ?) {i totul se scrie rapid [i compact (un algoritm Quicksort
`ncape `n doar patru-cinci r=nduri de program !) [i f\r\ aglomerarea
Securizarea sistemelor on-line (H6) – 10 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
aceea de paranteze cu care ne-au for]at s\ ne obi[nuim limbaje ca
Lisp (poreclit de unii "Limbajul InSuportabilelor Paranteze") sau ML.
Toate aceste concepte le vom prezenta r=nd pe r=nd, r\spunz=nd
una c=te una la ni[te `ntreb\ri pe care [i le pune cel care `nva]\ un
limbaj de programare. ~ncepem cu cele mai simple lucruri, cum ar fi
`ntrebarea dint=i:
– Cum se scriu `n Haskell tipurile de date (arhi)cunoscute din alte
limbaje: `ntregii, numerele reale [i alte tipuri comune ?
R\spunsurile vor fi detaliate, fiecare subcapitol dintr-un capitol fiind
centrat unei `ntreb\ri sau trat=nd, exhaustiv ori uneori tangen]ial, c=te
un subiect, caz `n care subiectul este ulterior reluat `ntr-un alt capitol.
Subiectul este anun]at de titlul subcapitolului `n cauz\.
De exemplu, `n capitolul I vom r\spunde printre altele la `ntreb\ri cum
ar fi :
– Cum se scriu `n Haskell operatorii ?
– Cum se scrie o func]ie simpl\ ?
– Cum se ruleaz\ un program ?
Ulterior vom trece la o serie de exemple, scriind mai `nt=i simple func]ii
`n Haskell, [i trec=nd gradat la exemple mai complicate. ~n primul
capitol ne vom ocupa printre altele de ni[te exemple care ilustreaz\:
– Felul cum se scriu func]iile
– Func]ia increment
– Func]ia factorial
Vom explica [i cum ve]i rula aceste exemple pe computerul
dumneavoastr\ dotat cu sistem de operare Linux. La realizarea
acestei c\r]i am folosit Mandrake Linux 8.2 (iar ulterior am trecut la
Mandrake Linux 10). Pute]i folosi orice distribu]ie cu condi]ia s\ ave]i
Securizarea sistemelor on-line (H6) – 11 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
inclus `n distribu]ie interpretorul Hugs sau s\-l instala]i ulterior. Hugs
este disponibil at=t ca arhiv\ zip c=t [i ca pachet .rpm. Teoretic
vorbind, aceste exemple pot fi rulate [i pe o ma[in\ Windows pentru
care de]ine]i software-ul necesar, o implementare de Haskell aliniat\
la standardul Haskell 98. Utilizatorii unor versiuni mai vechi sunt invita]
i s\ treac\ la Haskell 98, versiunile mai vechi fiind actualmente dep\-
[ite.
1.1. Tipurile Integer, Bool, Char [i altele; Tipurile compuse, liste [i
perechi
Atunci c=nd `ncepem `nv\]area unui limbaj, deoarece limbajul este
ceva destinat pentru a programa un calculator s\ prelucreze ni[te
date, unul dintre primele lucruri care ne-ar interesa este ce fel de date
putem prelucra cu acel limbaj [i cum se descriu ele. De obicei ne
intrereseaz\ s\ prelucr\m date din ni[te tipuri clasice: `ntregii,
numerele reale, valorile logice (numite uneori valori booleene),
simbolurile tipografice cunoscute sub denumitrea de "caractere" [i
citatele `ntre ghilimele, numite stringuri. Iat\ cum se numesc aceste
mul]imi de date – tipurile citate mai sus, `n Haskell 98:
Numerele `ntregi se numesc Integer sau Int.
Numerele reale sunt de mai multe feluri,re]ine]i deocamdat\ tipul
Float.
Valorile logice, booleene, dou\ la num\r (True [i False) formeaz\
tipul Bool.
Caracterele tipografice sunt elemente din tipul (care include [i
simbolurile), Char.
Securizarea sistemelor on-line (H6) – 12 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
Stringurile sunt de fapt liste de caractere iar tipul string se noteaz\ `n
consecin]\ ca un tip compus: [Char]. Parantezele p\trate
avertizeaz\ c\ este vorba de list\ de elemente de tipul descris `n
parantez\, ac]ion=nd deci ca un constructor de tipuri (cam cum era
perechea RECORD … END `n Pascal [i Oberon numai c\ aici se
declar\ liste nu structuri).
Nota]i [i faptul c\ `n biblioteca ce se `ncarc\ la pornirea interpretorului
(pe care v-o pute]i imagina deocamdat\ ca un fel de <stdio.h> din C,
cu toate c\ `n realitate ea ofer\ mult mai multe lucruri), bibliotec\
numit\ "Standard Prelude" sau mai pe scurt "Prelude" ve]i g\si [i alte
tipuri fie ele simple fie veritabile clase . V\ invit\m s\ le descoperi]i.
C\uta]i cuvinte ca Rational, Double…
Re]ine]i: Cele mai simple tipuri de sunt:
Integer (sau Int), Bool, Float, Char
iar stringurile formeaz\ tipul [Char] denumit cu aliasul String.
Deocamdat\ nu discut\m am\nunte subtile despre tipurile de date .
Acestea `ns\ exist\: de exemplu despre diferen]a `ntre Int [i Integer
programatorii h=r[`i]i v-ar spune c\ func]ile care folosesc pe unul sunt
pu]in mai mai rapide dec=t cele care `l folosesc pe cel\lalt.) Asemenea
diferen]e nu vor fi vizibile `n exemplele noastre. De asemenea, nu
punem `n discu]ie aici pe () un fel de tip cu un singur element notat
chiar cu (). Aceast\ valoare () va fi folosit\ la opera]ii de intrare/ie[ire.
Aten]ie: ~n Haskell numele tipurilor de date `ncep `ntotdeauna cu
Securizarea sistemelor on-line (H6) – 13 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
majuscul\. Regula este valabil\ [i pentru tipurile utilizator, motiv
pentru care ve]i scrie tipul Arbore cu A majuscul\, atunci c=nd ve]i
avea nevoie de un asemenea tip. ~n schimb func]iile se scriu cu
minuscul\, de exemplu o func]ie care incrementeaz\ o variabil\ o ve]i
numi inc. Haskell 98 este un limbaj din categoria celor `n care
minusculele [i majusculele au sens diferit, fiind asemenea din acest
punct de vedere cu limbajele C, Java [i Oberon .
Tipuri compuse: Pe l=ng\ modurile de a construi tipuri definite de
utilizator (pe care le vom prezenta `n alt capitol, Haskell permite
construirea de liste [i perechi. Acelea[i semne (paranteza p\trat\
respectiv cea rotund\ [i virgula care separ\ elementele) se folosesc [i
pentru a construi tipul compus din tipuri mai simple dar [i pentru a
construi valoarea compus\ din valori mai simple.
Exemple:
[Integer] – list\ de `ntregi iar [1,2,3] – lista format\ din 1 2 [i 3
(Char,Int) – perechi de Char [i Int ('b',4) – 'b' [i 4 `mperecheate
Aten]ie: Caracterele se scriu `ntre ghilimele simple, ob]inute cu tasta
de l=ng\ Enter. Cel\lalt fel de ghilimele simple, inverse, ce se ob]in cu
tasta de sub Escape, sunt folosite `n alt scop `n Haskell (la definirea
operatorilor infixa]i). Nu le confunda]i ! Vom remarca [i faptul c\
stringurile admit o scriere dubl\, at=t ca liste de caractere c=t [i ca
texte `ntre ghilimele duble. Ex. ['a','l','f','a'] versus ”alfa”.
Observa]ie: Elementele unei liste pot fi: – oric=t de multe
– dar de acela[i tip, unic
Securizarea sistemelor on-line (H6) – 14 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
Dar:Elementele unei perechi sunt: – exact dou\
– dar pot fi din dou\ tipuri
diferite dinainte precizate
Vom vedea `n capitolele urm\toare c\ utilizatorul poate :
– s\ introduc\ noi tipuri [i noi constructori de tip
– s\ redenumeasc\ tipuri (de exemplu [Char] se poate redenumi
String [i `n acest nume, String chiar se folose[te ca atare)
– s\ inventeze noi feluri de date, definind constructorii de date
(deoarece nu este obligatoriu s\ se folosesc acela[i nume de func]ie
pentru a descrie cum se compun at=t tipurile c=t [i valorile lor – dar
despre acestea discut\m `n alt capitol)
–exist\ [i al]i constructori de tip. Pe l`ng\ (), [] , exemplele
urm\toare `l vor folosi intensiv pe “->” ,cel care construie[te tipul
unei func]ii.
1.2. Operatorii (opera]iile)
Operatorii sunt grupa]i `n 10 clase de prioritate. Un operator, chiar [i
unul definit de utilizator (Da exist\ a[a o posibilitate `n Haskell !)
trebuie plasat `ntr-una din cele 10 clase de prioritate. ~n acest fel,
Haskell poate stabili corect ordinea opera]iilor dintr-o expresie,
indiferent ce operatori sunt implica]i. Unii operatori asociaz\ implicit la
st=nga, al]ii la dreapta. Operatorii infixa]i care au un nume format din
litere apar `n programe cu acest nume `ncadrat de ghilimele simple
inverse (de pe tasta cu semnul tilda). Regula aceasta este valabil\ [i
pentru operatorii defini]i de programator. Dac\ ve]i deschide cu un
editor de text fi[ierul
Securizarea sistemelor on-line (H6) – 15 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
/usr/share/hugs/lib/Prelude.hs (Standard Prelude) ve]i g\si acolo,
deja declara]i, o serie `ntreag\ de operatori. ~i vom comenta imediat
pe cei mai mul]i dintre ei, preciz=nd pentru fiecare printr-o pereche
liter\ – cifr\ dac\ e asociativ la dreapta (R) sau st=nga (L) [i ce nivel
de prioritate are.
Iat\ o mic\ list\ de operatori declara]i `n Standard Prelude :
R9 .
L9 !!
R8 ^ , ^^ , **
L7 * , / , `quot` , `rem` , `div` , `mod` , :% , %
L6 + , –
R5 :
4 ==, /=, <=, <, >=,>, `elem`, `notElem`
R3 &&
R2 ||
L1 >> , >>=
R1 =<<
R0 $, $! , `seq`
Recunoa[te]i imediat aici: pe nivelul 6 sunt adunarea [i sc\derea iar
ace[ti operatori asociaz\ la st=nga. ~n Haskell a+b+c este deci `n]
eles ca (a+b)+c . Pe nivelul 7 g\si]i `nmul]irea, `mp\r]irea [i
operatorii care calculeaz\ c=tul [i restul. Operatorii `div` [i `mod`
sunt similari cu omologii lor din Pascal. div face `mp\r]i-rea `ntreag\ [i
ob]ine c=tul iar mod ob]ine restul.
Remarca]i c\ operatorul care implementeaz\ no]iunea de "diferit" este
Securizarea sistemelor on-line (H6) – 16 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
scris `n Haskell “/=” , spre deosebire de alte limbaje (Pascal, C,
Oberon). Observa]i c\ rela]iile de apartenen]\ care exprim\ no]iuni ca
"a fi element" [i "a nu fi element" au denumiri formate din litere:
`elem` respectiv `notElem`.
Opera]iile logice, conjunc]ia [i disjunc]ia se noteaz\ ca `n C [i le g\si]i
pe nivelele de prioritate 2 [i 3.
Operatorii de pe nivelul 1 servesc la scrierea opera]iilor dintr-o
monad\. Aceste structuri algebrice, monadele, provin din teoria
categoriilor [i se poate lucra (nativ) cu ele `n Haskell 98 deorece
clasele corespunz\toare sunt predefinite `n Prelude. Un exemplu g\si]i
`n capitolul 6. Poate n-a]i [tiut c\, de exemplu, un model de sistem
care face calcule, model `n care calculele dau valori [i modific\ o
memorie (ca atribuirile) se implementeaz\ imediat `n Haskell ca o
monad\.
Nu uita]i c\ Haskell este un limbaj func]ional, care opereaz\ cu func]ii
de la date la rezultate (acestea put=nd fi din tipuri diferite). Un calcul
f\cut de un program este p=n\ la urm\ o asemenea func]ie. Vom
vedea c\ operatorul >>= este compunerea `n succesiune a dou\
calcule. Ceea ce se ob]ine depinde evident de cele dou\ calcule.
Operatorul >>= , (pronun]at "bind") exprim\ doar felul cum se
combin\, cum se succed ele.
. – este compunerea func]iilor
^ – este ridicarea la putere
`quot` – similar\ ca nume cu o func]ie din Lisp
`div` – `mp\r]irea `ntreag\
`mod` – restul dat de `mp\r]irea `ntreag\
+ , – – adunarea [i sc\derea, supra`nc\rcate
Securizarea sistemelor on-line (H6) – 17 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
: – cons, ad\ugarea unui elment `n capul
unei liste
==, /=, <=, <, >=,>- rela]iile, compara]iile, supra`nc\rcate
`elem`, `notElem`- apartenen]a [i neapartenen]a la o list\
(mul]ime)
&& – conjunc]ia
|| – disjunc]ia, (nega]ia se noteaz\ cu not )
>> , >>=- operatori pentru monade
(de obicei `nl\n]uiesc calculele fiind
cumva similari lui ";" din limbajele
imperative. Pot fi redefini]i `n instan]ele
claselor monadice pentru a ob]ine
diverse efecte)
=<< – la fel dar cu operanzii `n ordine inversa
Cu ajutorul lor sunt defini]i [i al]i operatori, de exemplu folosindu-se
operatorul “:” (pronun]at “cons” ca `n Lisp) este definit\ concatenarea
a dou\ liste sau a dou\ stringuri, notat\ cu ++ . Ve]i folosi frecvent
acest operator.
1.3. Func]iile. Exemplul Nr.1, func]ia increment.
Matematicianul care face o declara]ie de func]ie va scrie `nt=i
semn\tura acesteia (adic\ schema de tipuri c\reia func]ia i se
conformeaz\). ~n Haskell ea se nume-[te chiar tipul func]iei, deoarece
"->" este [i el un constructor de tipuri, capabil s\ `mbine dou\ tipuri [i
s\ ob]in\ altul. (Ob]in=ndu-se astfel o "func]ie de la … la…").
Securizarea sistemelor on-line (H6) – 18 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
Exemplu: f : Z -> Z prin rela]ia f(x) = x + 1 se scrie `n
Haskell:
f:: Integer -> Integer
f x= x + 1
Cap1Par3Ex1.hs
Pentru a-l testa, scrie]i acest mic program cu un editor de text :
Cap1Par3Ex1.hs
Pute]i alege orice editor dori]i din cele disponibile (kwrite, gedit,
emacs, xemacs, vi, pico). Salva]i programul sub numele
Cap1Par3Ex1.hs.
C=teva explica]ii sunt aici [i acum necesare:
Alinierea pe vertical\, este extrem de important\. ~n limbaje ca
Pascal, C sau Oberon [i multe altele, un programator putea scrie tot
programul pe un singur r=nd, f\r\ ca aceasta s\ deranjeze
compilatorul sau interpretorul. Acest lucru nu se poate face `n Haskell
deoarece Haskell, pentru a elimina acele paranteze care ne cople[esc
`n Lisp sau ML, folose[te un concept revolu]ionar: sintaxa
bidimensional\. Iat\ ce trebuie s\ [ti]i deocamdat\ despre ea:
Trecerea pe r=ndul urm\tor, dar mai la st=nga dec=t pe precedentul
Securizarea sistemelor on-line (H6) – 19 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
r=nd echivaleaz\ cu o `nchidere de structur\ sau parantez\. E ca [i
cum s-ar pune automat `n Lisp parantez\ `nchis\. (Re]ine]i c\ Haskell
este un limbaj cu sintax\ bidimensional\!). Aceast\ aranjare `n pagin\
se nume[te cu termenul englezesc “layout”. Este chiar posibil ca
interpretorul s\ semnaleze prezen]a incorect\ a unei paranteze pe
care dumneavoastr\ n-a]i scris-o, din cauza unei asemenea erori de
layout. ~n asemenea cazuri verifica]i alinierea pe vertical\ [i ave]i grij\
ca nu cumva unele r=nduri s\ `nceap\ mult prea din st=nga. Pare un
dezavantaj dar lipsa acelor paranteze din Lisp merit\ pre]ul acesta,
dup\ p\rerea mea. Practic, este esen]ial s\ alinia]i corect pe vertical\
tot ce este `n interiorul unei substructuri sintactice, sau, dac\ sunte]i
`ncep\tor, s\ p\stra]i alinierile pe vertical\ din exemplele nostre [i s\
programa]i cam `n acela[i stil (sau unul mai bun). Nota]i [i faptul c\,
urmare a sintaxei bidimensionale, `n Haskell este important s\ pune]i
spa]iile `n anumite locuri. Un tab este considerat egal cu 8 spa]ii, motiv
pentru care trecerea la un editor de text pentru care TAB-ul are alt
num\r de spa]ii poate creea unele probleme. Sfatul meu pentru
`ncep\tori: Lucra]i cu tasta SPACE nu cu tasta TAB c=nd ave]i nevoie
de spa]ii.
Extensia fi[ierelor con]in=nd surse de program Haskell este .hs . Mai
exist\ o extensie .lhs pentru "literate – Haskell" acele texte de lucr\ri `n
care totul este comentariu cu excep]ia liniilor care `ncep cu > [i
formeaz\ ele `nsele programul. (~n Cap 6. se folose[te acest stil de
scriere.)
Securizarea sistemelor on-line (H6) – 20 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
Pornirea interpretorului Hugs.
Hugs este numele interpretorului Haskell 98 livrat `mpreun\ cu
distribu]iile de Linux. Nu este `ns\ inclus `n toate distribu]iile oferite
spre download. Eu l-am g\sit inclus `n distribu]iile Mandrake 8.2 [i
Mandrake 10. ~l puteti lansa cu una din comenzile:
hugs
hugs <numefi[ier>
hugs “<numefi[ier>”
Ghilimele sunt necesare dac\ numele de fi[ier con]ine spa]ii.
Observati `n imaginea de mai sus c\ fiind lansat cu comanda
hugs Cap1Par3Ex1.hs
interpretorul deschide [i citeste programe din dou\ fisiere: Standard
Prelude [i fi-[ierul dat de noi `n linia de comand\.
~n paragraful urm\tor vom explica cum s\ rula]i exemplele incluse `n
aceast\ carte.
Securizarea sistemelor on-line (H6) – 21 – 13 Helv-DRAFT Dan Popa, 5 nov. 2006
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Funcii i aritmetic [611453] (ID: 611453)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
