Escolar Documentos
Profissional Documentos
Cultura Documentos
Papa
INTRCDUCERE f N
ft~SKELL 98
PRIN EXEMPLE
qsort [] = []
qsort (x:xs)
= qsort pre ++ [x] ++ qsort post
where
pre = [ n n< - xs, n < x 1
post = [ n n <· xs, n >= x 1
0 introducere in Haskell 98
prin exemple
~04.43 HASKELL 98
Cuprins
Autorul acestei carp a inceput deci pregatirile pentru o teza de doctorat studiind
lucran scrise in Haskell un limbaj care era nou-nout (ceea ce a dus Ia planul de a-i
scrie un manual original, in limba romana) avand ca unice resurse un CD al
distributiei franceze Mandriva Linux 8.2 ('inlocuit ulterior de cele de Ia versiunile 9.0
~i 10.0 ~.a.m.d) oferit (fiecare) de revista CHIP ~i pe care se afla, printre alte pachete
cu free software ~i interpretorullimbajului Haskell, numit Hugs.
0 alta resursa care ne-a fost de folos in acele vremuri a fost versiunea engleza a unui
exemplar al carpi ,,A Gentle Introduction to Haskell 98" semnata de cei trei mari
special~ti in Haskell de Ia Yale ~i Los Alamos: Paul Hudak, John Peterson, Joseph H.
Fasel.
Cam in aceea~i perioada, cu acordul Prof. Simon Peyton Jones am deschis pentru
publicul roman o pagina web cu intrebari ~i raspunsuri despre Haskell, marcand astfel
na~erea a ceea ce se nume~te Ro/Haskell Group, care va ajunge ceva mai tarziu
proiect oficial al Universitatu ,.Vasile Alecsandri" din Bacau. In acel moment nu mai
exista decat un singur grup european (non britanic) creat pe acel site, grupul spaniol.
Aceasta prima pagina s-a transformat in scurt timp 'intr-un site cu de sute de pagini,
cu zeci, sute ~i apoi mii de accese pe luna. Este vorba de
www.haskell.org/haskellwiki/RofHaskell. Ulterior, www a fost redenumit wiki. Iar
adresa a devenit https://wiki.haskell.org/Ro/Haskell.
Site-ul a oferit (~i ofera inca,) raspunsuri la intrebari despre limbajul Haskell
dinaintea publicarii edipei romane a carp_i celor trei autori - menponap mai sus - de
catre editura Matrix Rom ~i dinaintea publidirii primului manual romanesc de
Haskell de ditre editura locala, bacauana, Edusoft. Acest prim manual de Haskell a
fost scris ulterior realizarii primei parp a site-ului.
Volumul acesta, pe care il tinep acum in mana este primul manual de Haskell din
Romania, republicat acum mtr-o editie revizuWi ~i adaugita, prima edipe fiind de
mult epuizata. Capitolul noua, care i s-a adaugat proviDe dintr-o cercetare despre
construqia compilatoarelor desfasurata tot Ia Univ. ,Vasile Alecsandri" din Badiu.
Autorul a lucrat la aceste materiale, atunci ~i acum, din pura pasiune, fara nici un
onorariu special pentru aceste proiecte ~i transrnite sincerele sale multumiri tuturor
celor care au avut curajul de a-~i folosi capitalul ~i munca in aceasta ambipoasa ~i
riscanta intreprindere: promovarea intr-o Romanie pe atunci cantonata m epoca
limbajuluj LISP (un limbaj funcponal slab tipizat, interpretat ~i lent) a unui Limbaj
funcponal pentru industrie ~i cercetare revoluponar: Haskell este un Hmbaj functional
puternic tipizat, compilabil cu compilatorul GHC - Glasgow HaskelJ Compiler - ~i
mult mai productiv.
Sunt destinatari ai acestor mulfUmiri top cei care, la editurile care ne-au sustmut ~i
publicat, au contribuit, fiecare dupa posibilitap, cu munca, cu grafica, cu critica sau
cu capitalulla aparitia aces tor editH ale carpi or des pre Haskell.
Cuvant inainte
Simon Peyton-Jones
~j
.j
Ill
Foreword
Moreover, in the last few years, Haskell has moved from being an
fascinating academic language to being a tool that many
programmers use because it's the fastest way to get the job done.
If you doubt this, join the #haskell IRC channel, or the Haskell-cafe
mailing list, and you will find a vibrant, enthusiastic, and helpful
community of Haskell users.
Simon Peyton-Jones
Unul dintre motivele pentru care Haskell este atat de productiv este
posibilitatea de a Iuera cu functii de nivel superior, polimorfice, operAnd
inclusiv pe structuri de date definite inductiv. Acele structuri de date
beneficiaza de functii de 110 $1 comparare ($i nu numai) generate automat
de sistem prin "deriving" ori definite de utilizator. Functiile de nivel
superior pot incapsula intregi $abloane de programare a aplicatiilor luand
locul acelor $abloane de proiectare cu care v-ati batut capul in alte
cursuri . Doriti o aplicatie dupa acela$i $ablon ? Luati functia de nivel
superior dorita $i dati-i ca parametri alte functii, specifice aplicatiei.
V-ati batut capul nu o data sa rescrieti rutinele de afi$are ale unor structuri
de date compuse (liste de arbori cu nod uri perechi de .. . $am d) care se
schimbau pe masura ce dezvoltati proiectul? Ati refacut mereu functiile de
comparatie pentru astfel de structuri de date compuse? Folositi Haskell $i
adaugati declaratiilor de date "deriving Show" respectiv "deriving Eq" (lar
lista nu se opreste aici.) Haskell face automat restul iar tipul nou creat
capata din cllpa declararii functiile de afi$are sau comparare ce-i sunt
necesare tara sale mai scrieti dumneavoastral Dar le pute~ rescrie daca
nu va place efectul calor implicit generate.
Dan Popa
Bacau, ianuarie 2007-2014
cum ar fi :
- Cum se scriu In Haskell operatorii ?
- Cum se scrie o functie simpl~ ?
- Cum se ruleaz~ un program ?
Ulterior vom trace Ia o serie de example, scriind mai inUli simple
functii in Haskell, $i trecand gradat Ia example mai complicate. Tn
primul capitol ne vom ocupa de ni$te example care ilustreaza:
- Felul cum se scriu functiile
- Functia increment
- Functia factorial
1.1. Tipurile Integer, Bool, Char '' altele; Tipurile compuse, liste
'' perechi
n
date putem prelucra cu acellimbaj $i cum se descriu ele. De obicei
ne intrereseaza sa prelucram date din ni$te tipuri clasice: 7ntregii,
numerele reale, valorile logice (numite uneori valori booleene),
simbolurile tipografice cunoscute sub denumitrea de "caractere" $i
citatele intre ghilimele, numite stringuri. lata cum se numesc aceste
multimi de date - tipurile citate mai sus, in Haskell 98:
1
Numerele reale sunt de mai multe feluri ,retineti deocamdata tipul
Float.
Valorile logice, booleene, doua Ia numar (True ~i False) formeaza
tipul Boo/.
Caracterele tipografice sunt elemente din tipul (care include ~i
simbolurile), Char.
Stringurile sunt de fapt liste de caractere iar tipul string se noteaza
In consecinta ca un tip compus: [Char]. Parantezele patrate
avertizeaza ca este vorba de lista de elemente de tipul descris In
paranteza, actionand deci ca un constructor de tipuri (cum era
perechea RECORD ... END In Pascal ~i Oberon numai ca aici se
declara liste nu structuri).
R9.
L9 II
R8 A I,.,. I**
L7 * , I I 'quof I ' rem' I ' div' I ' mod' 1 :% I%
L6 +I.
R5:
~I
4 ==, 1=, <=, <, >=,>, 'elem', 'notEiem'
R3&&
R21l
L1 >>' >>=
R1 =<<
RO $,$!,'seq'
operatorii care calculeaz~ catul $i restul. Operatorii ' div' $i ' mod'
sunt similari cu omologii lor din Pascal. div face imparti-rea intreaga
$i obtine catul iar mod obtine restul.
Remarcati ca operatorul care implementeaz~ notiunea de "diferit"
este scris in Haskell "/=", spre deosebire de alte limbaje (Pascal, C,
Oberon). Observati c~ relatiile de apartenent~ care exprim~ notiuni
ca "a fi element" si "a nu fi element" au denumiri formate din litere:
· elem' respectiv •notElem'.
Operatiile logice, conjunctia si disjunctia se noteaz~ ca in C si le
g~siti pe nivelele de prioritate 2 si 3.
Operatorii de pe nivelul 1 servesc Ia scrierea operatiilor dintr-o
monada. Aceste structuri algebrice, monadele, provin din teoria
categoriilor si se poate Iuera (nativ) cu ele in Haskell 98 deorece
clasele corespunzatoare sunt predefinite in Prelude. Un exemplu
gasiti in capitolul 6. Poate n-ati $tiut ca, de exemplu, un model de
sistem care face calcule, model in care calculele dau valori si
nf 1
imperative. Pot fi redeflnltl in lnstantele
anumitor clase - monad lee - pentru a
obtine diverse efecte)
=<< - Ia fel dar cu operanzll in ordine lnversa
CH5 ~ 0~ ~ t\1 ~ ~ ~ ~ ~~
f .. Integer - > Integer
f X = X + 1
Puteti alege orice editor doriti din cele disponibile (kwrite, gedit,
emacs, xemacs, vi , pico, nano). La Notepad ++ stabiliti mai lnainte
c~ TAB=8 spatii. Salvati programul sub numele Cap1Par3Ex1 .hs.
hugs <numefi$ier>
hugs ''<numefi$ier>"
Ghilimele sunt necesare dac~ numele de fi$ier contine spatii.
Observati In imaginea de mai sus ~ fiind lansat cu comanda
hugs Cap1 Par3Ex1.hs
interpretorul deschide $1 citeste programe din dou~ fisiere: biblioteca
Standard $i fi$ierul dat de noi In linia de comand~.
I"'D • Shell
I
Acum puteti intreba interpretorul ce valoare are, de exemplu, f (1 00).
in Haskell a$a ceva se scrie tara paranteze:
Main> f 100
lnterpretorul Haskell va raspunde, cum era de a$teptat:
101
"·>"
r
1.6. Suma a doua numere
voi intelege ca suma are tipul Integer -> Integer -> Integer
apoi Ia randul ei sum a 7 are tipul Integer -> Integer
iar expresia suma 8 7 are tipul Integer
Cap2Par1 Ex1.hs
Cl 5 ~ 0 ~ ~ ~ X ~ ~ ~~~
-- Funct i a g aplica o alta functie de doua ori ..
r-
-- Dan Pope 30 •artie 200~
f ..
. . Integer -> Integer
f X = X+ 1
r-
g .. <Integer -> Integer) -> Integer -> Integer r;
g f X = f (f x ) r-
~
line· 2 Col 27 I INS I I
Programul Cap2Par1Ex1 .hs in curs de editare.
g n x g (n-1) (g n (x-1))
Cap2Par2Ex2.hs
06&0~ ~ ~ XQ)~ ~ ~ •
Functia lui Ac kerMann - Peter
-- Dan Popa 30 •artie 2005
t. "f• • I I
. · ·r-1~
File Sessions SetUngs Help
Main> g 0 2 ...
3
Main) g 1 2
4
Main) g 1 3
5
Main> g 1 4
6
Main) g 2 4
11
Main> g 2 5
13
Main> g 3 5
253
Main> g 3 6
509
Main> g 4 6
I
D.[[t]
Calculul valorllor functlellul Ackerman-P6ter cu programul Cap2Par2Ex2.hs
Una dintre cele doua imaginile alaturate arata outputul comenzii top
8 :57pe ..., <42 llin. 1 user. load IIVerase: 1.62. 1.15. O.n
57 prooe5Se3: 5o4 sleep.ln6. 3 runn.ln6. 0 zo.bte. 0 st~
CPU s tates: 99.01: user. 0.91: syst.... 0.01: nice. 0.01: idle
Neto : 2557801< av. U<46281C used. 14U52K free . 01( shrd. 102601< buff
Seoap: 2570001< IIV. 01( used. 2570001< free <487561< cached
Ll"'"''
1904 den
pttwnwww,_IMQMMMUIMIII*'MIIi!MIIIII!MII'
20 0 6408 6408 1160 R 96.9 2.5 15 :23 hugs
1931 dan 10 0 1032 1032 812 R 0.3 0.4 0 :00 top
1907 den 9 0 8960 8960 7252 R 0.0 3.5 0:00 konsole
Cap2Par4Ex2.hs
D6& 0 ~ ~ ~ X~[j ~ ~~
-- Functia sign de calcul a se•nului unui njumar
-- Ilus treaza notiunea de garda intr- un sablon
-- Observati ca pentru acelasi sablon sunt posibile
-- •ai multe formule de calcul iar accesul la fiecare din
-- ele este pazit de un predicat numit garda
-- Oupa : A Gentle Introduction to Has kell 98 pg 16
41 I l•J •
Line: 7 Col: 1 I INS I I
Cap2Par4Ex2.hs -in curs de editare
-- Si functia sig•a
s ig•a ::Integer-> Integer - > (!nteger- >Integer) - >Integer
sig•a •ax •ax = f •ax
s ig•a .tn • ax = (f •in) + (sig•a <•in+l) •ax)
I • ~·~ f • I t ~ ; t • • JIDJ[IC
File Sessions Settings Help
/usr/share/hugs/libfPrelude.hs
Cop2Par4Exl.hs
Tupe :? for help
Moin) sign 0
0
M&in) sign 1
1
Main> sign -2
ERROR - Illegal Heskell 98 class constraint ln inferr ed type
••• Expression : sign - 2
• • • Type : Hua (Integer - > Integer) => Integer -> Integer
Cap2Pari)Ex1.hs
Llne: 5 Col: 21
fa ct 2 1
f ac t 2 2
f ac t 2 3
fa c t2 4
fa c t 2 ( - 10)
Haskell 98 ~ode: Restart with co•aand line option -98 to enable extensions·
Main> I
D.llB
Mesaj de eroare de tip. Atl incercat si sumati constante nu functii.
Cap2Par7Ex1.hs
(\x -> 3) , (\x -> 7) (\x -> 10) .lar acestea sunt functii
constante dar de tipul lnteger->lnteger ~i pot fi i'nsumate cu sigma.
(\X-> X+ 1) 1 da rezultatul 2
(\ X y -> X + y) 23 d~ rezultatul 5
(\ g x -> g x) f 1 d~ rezultatul 2, f fiind pt. noi incrementarea
4 ..< 4 •
...
lint. 10 Cot 18 INS • -
f ~ • l • I I : '. I • • • t 1 t :0 I •
0
Main> (\x - > x • 1> 1
2
Main> (\x y - > x • y ) 2 3
5
Main) (\g X -> g x) r 1
2
Mein >
Main> slg• a 1 4 (\x - > 2>
8
Main ) s l g• a 1 4 (\x -> x • x)
30
Main) (\x - > x • x) S
25
Mai n) I
D.lin
Exemplele de utlllzare a abstractlllor (functli anonlme) .
6
~i iar~$ i, vedem c~ functia anonim~ 1$i extrage corect valorile
necesare din structura care corespunde (trebuie s~ corespund~) . cu
ceea ce este scris In paranteza ei.
in urma declaratiei de mai sus tipul triunghi care rezulta este un tip
polimorfic, put~nd exista in programul care-1 folose$te fel de tel de
triunghiuri. De exemplu:
Tripleta 'A' ' B' I C I este un triunghi de caractere,
din tipul Triunghi Char
Tripleta (1 .2,2.3) (1 .5,2.7) (1 .9,3.0) este un triunghi de perechi de
numere reale
din tipul Triunghi (Float , Float)
Tripleta "lon" "Popescu" "loana" este un triunghi de nume
(stringuri) care apartine
tipului Triunghi String
Observati ca prin inlocuirea variabilei de tip a cu un tip concret ,
Char, String,(Fioat , Float) obtinem din tipul eel mai general al
triunghiurilor tipuri particulare. Aceasta este o proprietate a
sistemului de tipuri din Haskell, unei entitati i se pot asocia mai
multe tipuri dintre care unul este eel mai general tip al ei $i este unic.
bine determinat.
0 5 & 0~ !11 ~ X Q) ~ ~ ~~
-- Un tip nou de date. tipul poli•orfic triunghi ~
-- Dan Popa 25 •artie 2005
-- Exe•plu din cap 3
(
1
c ', 1 d 1
)
Rezultatul va fi: • z •
> True
True
ll!fll
Cap3Par2Ex2.hs - procesarea datelor construlte de utlllzator.
aral8a1
arataai
Marti
Hiercuri
=
"Hartl"
=
"Miarcuri"
arataai Jo i = "Jot••
arataai Viner! = "V.inerl"
ar ataai Saaba t a = "Saabat a•·
arataai
'UnO 24 co1
Duainica = "Ouainica··
JU-fiii'fs·rr--
..
Cap3Par2Ex3.hs
Cap3Par2Ex3.hs
Type :? for help
Main> arata• i <• line Miercuri)
"J ot "
Main> I
[ll~
da t a Arbore a =Frunza a I
Ramificatie <Arbore a ) (Arbore a)
tunde -- [a]
Arbore a - > (a]
tunde <Frunza e)
tunde <Ra•iflcatie ra•l raa2)
=
= tunde raml ++ tunde r a a2
.._Linet3ColtO ( INSI I
Cep3Par3Exl.hs
Type :? f or he lp
He tn > t unde (Ra•i fi catie (fr un za 3 > ( f ru nza 4))
[3 .4]
Ha ln) I
D.[~
La executie otJtlnetf ca rispuns llsta frunzelor.
I . , •t •I I • I. I •
"axy"
..
Main> tunde <Ra•ificatie (Frunza "a") (Rallificatie <Frunza "x
") <Frunza "~")))
[ .. a .. . "x"."y .. ]
Main> I
D.I~
Procesarea unul arbore.
[3.4]
Main) tunde <Ra•ificatie (Frunza 'a') (Ra•ificatie (Frunza
') (Frunza 'y')))
"axy"
Main) I
Pentru liste at~t constructorul de tip c~t $i eel de date sunt scrise Ia
tel, ca o parantez~ p~trata [ ], dar nu se scriu inaintea argumentelor.
Deci tipul "lista de elemente de tip a" nu se scrie [)a ci [a] iar lista cu
elementul care are valoarea lui a nu se scrie [ ]a ci [a). Lista vida se
scrie [ ), iar listele cu mai mutt de un element au elementele separate
prin virgule.
Example: [1,2,3] de tipul [Integer]
[(1,2) (3.4)] de tipul [(Integer,Integer)]
adica lista de perechi.
Elementele unei liste au toate acela$i tip, deci ['a',2] nu este o lista
coada (h:t) = t
Cap3Par4Ex1 .hs
Cap3Par4Ex1.hs
Type :? for help
Main> lungime [1.2.7.9]
4
Main> lungime [[1J.[3.4J.[5].[9.0JJ
4
Main> cap [[1J.[3.4J.[5J.[9.0JJ
[1]
Main> cap [1.2.7.9]
1
Main> coada [1.2.7.9]
[2.7.9]
Main> coada [[1J.[3.4J.[5J.[9.0JJ
[[3.4J.[5J.[9.0J]
Main> I
Liste si
Tipuri utilizator cu •ai •ulti constructor! de date
din Cap3 Par4. Dan Popa 30 •artie 2005
constructorul de date infixat TREBUIE sa inceapa cu
dar sa nu fie deja folosit ca : sau ::
Main ) I
Este clar ca am omis ceva. V-ati dat seama ce? Raspunsul este ca
scrierea listei ca mai sus se bazeaza pe (ati ghicit) asociativitatea
infixr 5 :::
data Usta a =I Ust aVlda
8... (lisle a)
lung .. lisle a -> Integer
lung UstaVida =0
lung ( a : : : 1) =1 + lung 1
Cap3Par4Ex2b. hs
T ~pe :? f or hel p
Main> l ung ( 3 ::: 4 Lis taVi da)
2
Main> I
..
D. I~
Se executA corect (Cap3Par4Ex2.hs)
mapping f [) 0
mapping f (h:t) f h : maping f t
Cap3Par4Ex3.hs
• o fi'
[llo £<lll llOO"'ari.S looll ~tmngs t1...
"! • • • •
ul tim (h : t) u l tim
Cap3Par5Ex2-ultlm.hs
D 5 9 0~ rt; ~ X Eb~ p; ~~
-- Ulti •ul ele•ent al unei list e
-- Dan Popa 31 •artie 2005
/usr/s hare/hugs/lib/Prelude.hs
Cap3Par5Ex3- element . hs
Type :? for help
Hain> element 3 (1.2.3 . 6.7.9]
3
Main> element 2 (101.103.208]
103
Main> I
[l
lnversarea unei liste este Ins~ o problem~ cava mai grea, daca
lncercati s-o rezolvati cu o singur~ functie cu un singur argument.
incercati aceasta daca doriti I
0 solutie mai elegant~ este s~ folositi o functie cu dou~ argumente
transferfmd elementele din primul argument in a/ doilea.
Ambele argumente sunt, evident, liste. Aceast~ "tehnic~". numit~
rl [) lista lista
rl (h : t ) lista rl t (h : lista )
Cap3Par5Ex1-reverse.hs
scris:
r evers [a) -> [a)
Sau, daca ~titi despre cifre ca au coduri ASCII succesive, puteti scrie
o functie mai scurta:
va l e : :Char - > Integer
v ale x = ord x - ord ' 0 '
000 dar aceasta solutie eficienta va obliga sa importati biblioteca in
D ~ .. .. ! •• .. ' .
-- A File Sessions Settings Help
vale D. I~
vale '0' - 0
vale '1' = 12
vale '2' =3
vale '3' =
val e '4' = 54
va l e '5' =
vale '6' = 67
vale '7' =8
vale '8' =
vale '9' = 90
vale - =
v a l li .. [Char] - > Integer
valli [] =0
valli [a] = vale a
valli (h:t.) = vale h + 10 w valli t
Exemplul, a~a cum ar~ta In timpul editarii este reprodus mai sus.
Cap3Par5Ex4-atoi.hs • in timpul rutaril
Un aft exemplu tipic este lista de asociere a valorilor din doua tipuri
type ListaAsoc a b =[ (a , b ) ]
Ct[~
D5& 0 ~ ~ ·~ X~~~~~
- - Quicksort
-- Cap3Par7Ex1
- - Oupa "A Gentle Introduction to Haskell 98" pg 9
• IID][X
File Sessions Settings Help
Main> ~
Main) quick [1.10.9.234.7.78.( - 1) ]
[- 1.1.7.9.10.78.234] -
~
Main) I ";'-
D.llfrj]
Cap3Par7Ex1.hs - qulck(sort) ordonAnd o llsti de intregl
ll
.,
~-
Structuri de date ~i alte notiuni utile
first 1 (h : t) [h)
first n (h : t) h : first (n-1) t
Cap4Par1 Ex1 .hs
units = 1 -- units
fir s t : :Int - > (a) - > (a)
firs t 0 _ = (]
firs t _ (] = (]
firs t 1 (h:t) = (h) ..•
firs t n (h:t) =h : first (n- 1> t
Line: 3 Col 51 I INS I I
[1.3.4]
Me~n> f~rst 4 [1.3.4.5]
[1.3.4 .5]
Mein) fir st 5 [1.3.4.5]
[1.3.4.5]
Mein> first 0 [1.3.4.5]
(]
Mein> fir s t 100 units
[1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
.1. 1 .1.1 .1.1 .1.1.1.1.1.1.1.1.1.1
.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
.1.1.1.1]
Main> I
D.!l6!
Pe urma lncercati sa evaluati: first 100 units. Doriti sa vedeti
primele 1000 de elemente din lista de unitati ? lata-le:
0 operatie care se face U$Or i ntra asemenea liste infinite este cea
furnizat~ de operatorul/=. Comparatia units /= otherunits va
furniza imediat r~spunsul a$teptat, True. De asemenea not
(units /= oth erunits) va furniza un r~spuns in timp finit:False.
• a •.
MaJ. n> I
D.I~
Compara111 fntre llste Infinite
' •• • • ~ t • • • • •
. , ., ~~
File Sessions seumgs Help
Cap4Par1Ex4 .hs •
Type :? f or help
Main> firs t 20 (nt oinf 1)
[1.2.3.4.5.6.7.8 . 9.10 .11 . 12.13.14 .1
5 .16. 17.18 .19.20]
Main> firs t 20 (ntoinf 0)
[0.1.2.3.4.5.6.7.8.9.10.11.12.13.14
.15.16 .17.18.19 ]
Main> fir s t 20 <•ap <A2) (ntoinf 1>
)
[1. 4 .9.16 . 25.36.49 . 64 . 81 .100.121.14
4.169.196.225.256.289 . 324.361.400]
Main) I
O.l~
Cap4Par1 Ex4.hs- primele 20 de pltrate ale unor numere naturale
[1. 2 .3.4.5.6.7.8.9.10.11.12.13.14.1 ~
5.16.17. 18.19.20]
Hain> firs t 20 (ntoinf 0)
[0.1.2.3.4.5.6.7.8.9.10.11 .12 .13.14
. 15 .16.17.18.19]
Ha i n > fi r s t 20 <•ap <A2) (nt o i nf 1>
)
[ 1.4.9.16.25.36.49.64.81.100.121.14
4.169.196.225.256 . 289.324. 361. 400]
Ma in > t a ke 20 <• ap (A2> ( n toinf 1))
[1.4.9.16. 25.36 .49 .64.81.100.121.144.169.196
. 225.256.289.324 .361.400] ~
Mai n > I ~
D.l!f11
Prlmele 20 de pitrate ale unor numere naturale selectate cu take
h ead :: [a ] - >a
h ead ( x: ) = X
cap4Par2Ex1 .hs
A doua este functia last care extrage ultimul element dintr-o list~ :
Lista e considerat~ ca fiind format~ din x, primul element, care poate
fi oricare, (motiv pentru care e folosit _ ) urmat de restullistei,noatat
xs.
tail ( :xs ) xs
Cap4Par2Ex3.hs
El returneaza True daca lista e vida. Altfel, daca lista are cap $i
coada, (coada poate fi vida 1), rezultatul este False.
Ex1-take.hs
Take {ca $i take1 de mai sus) este functia care extrage lista primelor
n elemente dintr-o alta lista obtinand o alta lista. Functia este
polimorfica, poate prelucra orice tel de liste.
Editati acest program (puteti remarca $i faptul ca exista doua moduri
diferite de a scrie aceasta functie, inversand ordinea primelor doua
$abloane):
Functia tak e
• o duri di fer i t e d e a o ae rie
i f si case
Dan Pop e 2 eprilie 2 005
d upe " A Gentle I nt rodu c t ion to Haskell 9 8 " PB 17
Testati felul cum extrag functiile de mai sus primele n elemente dintr-
o lista:
• D
File Seulona Semngs M'elp
Type :? f or he l p
Main> t ake1 0 [1.2.3]
[J
Mai n) t ake 1 1 [1 . 2 . 3]
[1]
Mai n ) take1 2 [1 . 2 . 3J
[1.21
Main> take1 3 (1.2 . 3)
[1.2.31
Mai n ) take2 1 ['a ' . ' c'. 'k']
··a ..
Main> t ake2 2 ['a' . ' c'. 'k']
··ec"
D.lllr)J
Listele de caractere sunt considerate String-uri.
lar functiile de mai sus pot fi folosite $i pentru a extrage prefixe dintr-
un string, stringurile fiind de fapt liste de caractere.
Ex2.hs
0 5/it O ~ !il) ~ X Q) ~ ~ ~ ~
-- Func tia t ake
-- • oduri diferite de a o s crie
-- cu cas e
-- Da n Popa 2 apr ilie 2005
-- dupa "A Gentle Introduction t o Has kell 98" pg 17
I
take1 : : Int - >[a] - > (a]
take1 n 1 = case (n.l> of
(0 . _) - > []
L .[J> - > [ ]
(n.h : t ) - > h : t a ke1 (n- 1 ) t
Este deci mai simplu ca. intr-un asemenea caz, in loc sa scrieti un
(-b+s) /da ,
(-b-s)/da
Ex3.hs- ecuatJa de gradul al doilea ( tipuri utillzator, let.. ln ... mal blne foloslt)
in Haskell, putem scrie calcule cum sunt cele din programul care
rezolva ecuatia de gradul al doilea $i concentr~ndu-ne asupra
programului $i abia apoi asupra formulelor subexpresiilor care se
(-b+s)/da ,
( - b - s)/da
where
comun~. De exemplu:
Unor termi ca celor de mai sus li se pot atribui rapid valori dintr-o
mul- time fixat~ cum este cea a intregilor, calculand valorile din
mers. Programul care face acest lucru se nume~te interpreter. Un
asemenea mic interpreter, realizat in manier~ clasic~. neextensibil~.
If ... then ... else... (de$i va fi explicat pe larg abia in capitolul 5.5)
constatam ca functioneaza exact ca in alte limbaje de programare
din familia C-ului. Acolo exista un operator ternar similar (notat cu
? :) care avea acela$i efect: daca expresia logica inifia/a era evaluata
Ia true se retuma valoarea urmatoarei expresii (aici cea de dupll
then) altfel se returna va/oarea celei de-a treia expresii cea de
dup~ else.
Sa nu uitam functia extend al carei rol este de a extinde contextul cu
variabila $i valoarea introduse suplimentar, de (obicei de) un With.
devine
data Tree = Leaf a Branch (Tree a) (Tree a)
deriving Show
l
0 introducers in Haskell 98 prin example - 140 - DanPopa
algebrica inzestratA cu propriile ei operatii specifice. Este momentul
in care realizam ca avem nevoie de o teorie algebrica a
interactiunilor dintre calcule. (Ea i~i va arAta utilitatea ~i Ia simularea
intr-un limbaj functional a programarii imperative, acea programare
realizata prin comandarea de calcule succesive computerului). Aici
intra In scena ni~te multimi de calcule numite monade (cu singularul
monad§).
Despre operatorul bind notat uneori ' bind ' iar mai recent (>>=) :
in Webster's New Century Dictionary am gasit numele traditional al
acestui operator laolalta cu traducerea denumirii sale:
rezultatul.
P. Wadler exprim~ privitor Ia acest sublect, (in lucrarile sale), c~teva ideii
fundamentale:
1) 0 functie f de Ia tipul a Ia b, f ::a-> b
devine in universul monadic o functie f :: a-> M b ( de Ia a IaMb) .
Acum ea prime$te un argument ca ~~ inainte dar returneaza o valoare
monadica.
2) Un interpreter in loc sa fie o functie cu semnatura
Rolul lui unitM este sa transfere valorile simple sau compuse direct
In monada adica in capsulele monadice. Altfel spusa sa transforme
va/ori in procese de calcul care ar produce acele valori. Valorile pot
apartine unor diverse tipuri. Daca vreti . unitM este versiunea
monadica a functiei identice. Ea a fost, a$a cum am mai spus,
ulterior denumita return, odata cu inventarea do-notatiei.
Vom vedea ca exista chiar o monada, monada identitate, in care
tipul a coincide cu tipul M a pentru orice a (deci constructorul de tip
M este $i el o functie identitate) iar in acest caz unltM este chlar
functia identica.
(\ a -> let b =f a in g b)
Operatorul bindM era folosit {Ia data aparitiei acelor lucrari) pentru a
descrie in maniera compozitionata semantica structurilor sintactice
cu substructuri, atunci c~nd nu se folose~te do-notatia. Luam
{asemenea profesorului lui Wadler) ca exemplu un term care este o
suma de doi subtermi iar interpretorul it va prelucra interpret~nd
Nota: Este mai vizibil pentru cititor efectul daca scriem in acest mod:
interp ( Add u v ) = interp u e · binc!M' (\ a ->
interp v e · bind.M' ( \b ->
add a b ))
do { x <- m;
return x} = m
... care Ia randul lor pot fi transcrise imediat (folosind definitia do-
notatiei din orice manual de Haskell) in do-notatie:
do {return (op p1)}
do { v1 <- d1 ; return (op v1)}
do { v1 <- d1 ; v2 <- d2; return (op v1 v2)}
do { v1 <- d1 ; return (op p1 v1)}
do { v1 <- d1 ; op v1 d2 d3 }
1
(App (Lam "x" (Add (Var "x") (Var "x"))) (Add (Con 12)
(Con 69)))
Exemplul de mai sus este inspirat de eel de Ia pg. 3 a lucr~rii "The
essence of functional programming" de P.Wadler. El corespunde
unui program care in limbaj surs~ ar avea sintaxa:
( lambda X • X + X ) (12 + 69)
sau expresiei din Haskell
Nota: Este mai vizibil pentru cititor efectul daca scriem in acest mod:
-- 1 ) ca utarea i n Environment
lookupE : : Name-> Environment-> M Val ue
lookupE x [ J ~ fail (" Variabila far a va l oare : " ++ x)
lookupE x ( (y, b ) :e) = if x•-y then r eturn b else lookupE x e
apply (Fun kl a = k a
apply f a = f a il (" Ar trebui sa fie functie : " ++
showval fl
-- Pentru e xecutie
Concluzii: Dupa cum se poate vedea din acest exemplu, limbajul Haskell
98 ~i conceptul de monada (din teoria categoriilor) sunt instrumente
puternice pentru studiul interpretoarelor ~i lucrul practic Ia realizarea de
interpretoare. Ceea ce am ilustrat aici este mai curand un "back-end" al
unui sistem care prelucreaza limbajul dar este perfect posibil sa se faca ~i
parsarea in Haskell, fie cu un parser creat automat de un generator, fie cu
unul scris ad hoc, ori cu monada parserelor (primul studiul de caz ).
return = Id
Observati ca ultimul rand se mai putea scrie altfel return y
l
care sunt valorile monadice) este ca lntotdeauna "return".
return k = SM (\ s -> (k , s ))
Ea produce capsule care contin o functie a c~rei transformare,
proiectat~ pe stari, este functia identica. Deci o functie care nu
modifica starea primit~ . dar o lmperecheaza cu o valoare data.
Valoarea rezultata, a$a cum se vede examinand primul element al
perechii, este cea dorita de noi - k.
7.5.Monada listelor
Exemplul este preluat din "A Gentle Introduction to Haskell 98" unde
figura Ia pg. 45.
declare:
type Parser St ring -> [ ( Tree , String )
Diversele parsere (care se vor folosi intr-un sistem bazat pe
combinarea parserelor) pot returna diverse feluri de arbori (ba chiar
arbori cu o ramur~. liste sau elemenet unice, etichete de noduri ori
alte valori). Tree va fi inlocuit cu o variabiiA de tip ceea ce face din
pn >>=\an->
f a1 a2 ... an
an<- pn
f a1 a2 ... an} -- fiind evident mai U$Or de citit
El se se poate scrie $i unidimensional, pe o singura linie de forma:
do {a1 <- p1 ; a2 <- p2 ; ... ; an <- pn ; f a1 a2 ... an}
Oeoarece valoarea rezultata trebuie sa fie tot o valoare monadica, In
cazul c~nd functia f nu returneaza o valoare monadica, valoarea va
trebui injectata In universul monadei cu return, ceea ce face ca
parserul sa arate a$a:
do { a1 <- p1 ;
a2 <- p2 ;
an<- pn ;
return (f a1 a2 ... an) }
~i acesta se poate scrie unidimensional, pe o singura linie de forma:
digiti = do {p <-digit
1 <- many digit
return (foldl (\a b -> lO*a+b) 0 (p:l))
HonParsing> ·~
HonParsing>
MonParsing> parse (item "mp\us · iteml "d~n·
I ( · d' . "an• l. ( · d • . ·an • l I
MonPa rsing>
MonParsing> I ~
~ ~Shell
1 ,~ • Shel
• shen
semnificatiei lui ";" din do-notatie, (care este definit cu >>) precum $i
faptului c~ >> este definit in clasa Monad din Prelude ca un bind
care ignor~ valoarea de Ia prima procesare ( m >> k = m >>= (\_
->k)), lista as contine dear rezultatele proces~rilor f~cute de p-uri.
MonPArSI ng>
HonP<~r s i ng>
HonPars i ng>
MonPars ing>
MonPArs lng> parse !!strtng 'AA'l s epby (s t ring "bb' ll •aabbaa•
( (('AA', •aa' ),"))
HonPars ing> parse ((s t ring •aa' l s epby (string 'bb' )) •aabcaa•
I ((•aa'), 'bcaa• ) I
,-o .. Shell
'-r- ---r-
Analiza unul 'lr de aa-url separate prln bb-url (dol ,1 resp. unul).
+++ return a
(- Iluatarea aolut~ei
Fie gramatica
expr : : a exp addop term term
term : : c term mulop factor factor
factor : : = diqiti I (expr)
diqiti : : = diqit I diqi t diqi ti
diqit : := 0 I 1 2 I ... I 9
addop + I -
mulop : := * I
-)
Foloaind combinatorul cbainll pt a implement&
recuraia atanqa pentru expr ai term aceaata qram.atica
poate fi traduaa direct intr- un proqram Haskell care
parcurqe expreaii cu numere de o cifra ai le
evalueaza la valorile lor intreqi .
expr
term
-- term ' chainll ' addop
factor 'chainll · mulop
factor • digiti+++ do{ symb " (" ; n <- e xpr ; symb " ) " ; return n}
digiti • do
p <-digit
1 <- many digit
return (foldl (\a b -> lO ' a+b) 0 !p: 11)
addop • do {symb "+" ; return (+)I +t+ do {symb "-" ; return (-) I
mulop • do {symb ; return ( • ) I +++do {symb " / " ; return (div) I
lmplementarea ~i testarea
do { a1 <- p1 ;
a2 <- p2 ;
an <- pn ;
return (f a1 a2 ... an) }
Exemplul2:
digi t= do{ x <-token (sat isDigit) ;
return (ord x- ord ' 0 ') }
parse (Parser p) =p
instance Monad Parser where
return a Parser (\cs -> [ (a , cs) ] )
p >>= f = Parser
(\cs -> concat
[parse (fa) cs2 I (a , cs2) <-parse p cs])
(- Iluatarea aolutiei
Fie gramatica
expr .. - exp addop term I term
term .. - term mulop factor I factor
factor .. - digit I (expr)
digiti .. - digit I digit digiti
digit .. - o I 1 I 2 I . .. I 9
addop .. - + I -
mulop .. - * I I
-)
-- Monada starilor
data SM a = SM ( S -> (a , S))
foarte mult cu return, dar aici rezultatul este chiar s-ui, extras din
stare. (intampl~tor aici starea e format~ chiar din acel s).
readSM : : SM S
readSM = SM (\a-> (s , a))
mai tarziu.
allocSM :: S -> SM S
allocSM 1 • SM (\a -> (a , s+l))
Aceasta este functia cu ajutorul careia dam startul unor calcule dintr-
o capsula SM (monadica, a unei monade cu stari), indiferent ce
calcule sunt acolo prescrise. Ar putea fi - ca In exemplul care
urmeaza - lntregul set de operatii care se fac cu ocazia compilarii
arborelui sintactic incepand, sa zicem, de Ia adresa 0000. Acest
center al adresei instructiunii generate - initial 0000 - este pe post de
mypri ntl nr []
• "\n" ++ show nr
myprintl nr ((lnstr a b) : 1)
• "\n " ++ show nr ++ "\t " ++
a ++ show b ++ myprintl (nr+l) 1
mainAO =compile (iif (qt (constant 10) (constant 20)) (attr 'x'
(constant 45)) (attr 'x • (const~t 50))
... sa rezulte un cod ma$ina care sa fie afi$at cum se vede in acest
comentariu:
( -- *MCOMP> mainAO
-- Compilarea constantei
-- return primeste o pereche cu doua argument.
-- lunqimea = 1 a codului si codul -•ina qenera t
-- Sub GBCI :
mainAl ., compile (constant 10)
*MCOMP> mainAl
fi obtinut perechea de perechi de mai jos, din care aflam at~t adresa
finala c~t ~i lungimea codului. Notati ca numarul dinaintea codului
este chiar lungimea acestuia II
-- Compilarea variabilelor
variable s
= do { aO <- readSM;
let al "' aO +1
adr = aymtable (a)
in do {
writeSM al ;
return (1, (Inatr "LD_VAR " adr] )
( -- MCOMP> mainB2
--}
(--
- -}
--)
*MCOMP> mainD3
*MCOMP>
--}
(--
IAnqth of the code: 2
0 LD VAR 120
1 OOT_INT 0
2
*MCOMP> mainE2
--)
*MCOMP> mainE2
attr • exp
= do ( aO <-readSM;
(l1 , codl) <- exp ;
let al = aO + 11
a2 = a1 + 1
adr .. aymtable •
in do ( writeSM a2 ;
return (11 + 1 , concat [codl ,
[Inatr " STORE " adr] ] )
-- compilarea aumelor
plus expl exp2
minus e .x p1 exp2
= do ( aO <-readSM;
(11,cod1) <- exp1;
writeSM (aO+ll);
(l2,cod2) <- exp2;
let a3 = aO + 11 + 12 + 1
in do writeSM a3 ;
return (11+12+1, concat [codl,
cod2 ,
[Instr "SUB " 0 1 1 )
divexp1 exp2
= do ( aO <-readSM;
(l1,codl) <- exp1;
writeSM (a0+l1) ;
(l2,cod2) <- exp2 ;
let a3 = aO + 11 + 12 + 1
in do ( wri teSM a3 ;
return (11+12+1, concat [cod1,
cod2,
[Inatr "OIV n 0 I l )
eq expl exp2
• do ( aO <-readSM;
(11,codl) <- expl;
writeSM (aO+ll);
(12,cod2) <- exp2;
let a3 • aO + 11 + 12 + 1
in do ( writeSM a3;
return (11+12+1, concat [codl,
cod2,
[Inatr "EQ " 0 ] ] )
1t expl exp2
= do ( aO <-readSM;
(1l,codl) <- expl ;
writeSM (&0+11);
t1
(12,cod2) <- exp2;
let a3 = aO + 11 + 12 + 1
in do ( writeSM a3 ;
return (11+12+1 , concat [cod1 ,
cod2 ,
[Ina tr "LT " 0 1 1 )
qt expl exp2
= do ( aO <-readSM;
(ll , codl) <- expl ;
writeSM (aO+ll);
(12,cod2) <- exp2;
let a3 = aO + 11 + 12 + 1
in do ( wri teSM a3 ;
return (11+12+1 , concat [cod1 ,
cod2 ,
[Inatr "GT " 0 1 1 )
{--
Lenqth of the code: 9
0 LD INT 10 constant& 10 va fi pus& in stiva
1 LD INT 20 constant& 20 va fi pusa in stiva
2 GT 0 comparatia dintre ele
3 JZ 7 daca da zero (fals) , se sare la ramura else
4 LD INT 45 incepe ramura then cu constant& 45 in stiva
s STORE 120 care e stocata la adresa 120
6 JP9 si teDDinam executia sarind dupa if
--)
(constant 20) > ; r~ndurile 4,5 ~i respectiv 7,8 sunt cele provenite din
compilarea atribuirilor: (attr ' x ' (constant 4S) > respectiv (attr •x•
iif cond a1 a2
= do ( aO <-readSM ;
(11 , cod1) <- cond ;
writeSM (a0+11+1) ;
(12,cod.2) <- s1 ;
writeSM (aO + 11 + 1 + 12 + 1)
(13,cod3) <- s2 ;
writeSM (aO + 11 + 1 + 12 + 1 +13) ;
r•turn (11+1+12+1+13, concat
[codl,
[Instr "JZ " (a0+11+1+12+1) ],
cod.2 ,
[Instr "JP " (&0+11+1+12+1+13)] ,
cod3 ] )
(- -
--}
~ - -
9.13. Compllarea instructiunii structurale: secven~
read a ;
read b ;
x: ::: 2 ;
(--*MCOMP> mainW
{--
Length of the code : 7
0 LD INT 10
1 LD INT 20
2 GT 0
3 JZ 7
4 LD INT 45
5 STORE 120
6 JPO
*MCOMP>
--)
*MCOMP> mainDW1
--}
0
ji, Ill ,I/
*MCOMP>
--}
proqram sl s2 s sequ sl s2
{--
*MCOMP> mainX
IAnqth of the code : 5
*MCOMP> mainO
(skip)
))
--)
Unii critici ar putea repro$a faptul ca nu am prevazut !?i felul cum s-ar
genera cod pentru o instructiune altemativa cu o singura ramura. Nu
main1 • compile
(iif (qt (variable 'n') (constant 10)
(attr 'x' (constant 1))
(skip)
(--
6 JP 7
7*MCOMP>
--)
-- Ok
main2 = compile
(sequ (iif (qt (variable ' n') (constant 10)
(attr • x • (constant 1))
(skip)
{--
IAnqth of the code: 7
0 LD VAR 110
1 LD INT 10
2 GT 0
3 JZ 7
4 LDINTl
5 STORE 120
6 JP 7
7*MCOMP>
--}
mai.n 3 = compile
(sequ (readv 'x')
(sequ (iif (qt (variable ' n') (constant 10) )
(attr 'x' (constant 1))
(skip)
(skip)
))
(--
main3b = compile
(sequ (constant 111)
(sequ (iif (qt (variable 'n') (constant 10)
(attr 'x' (constant 1))
(skip)
(skip)
Il
{- -
8*MCOMP> main3b
(•kip)
(--
--}
E•..c to f"cldor
~ lc\WINDO\IIS\TEMP\
[-*'Gf"ololtl
r tom-'*- - - . g
lr,...... I
r. Q_lcbl, etkl ·!""-£., "" I
r ~(clan,.,...,.,
~ ~ I
C4or
~
- -
~ :J1
'"*
)<
~
..,.,ce
.!)
""'"" -~
~
... ..l!l.. tlJ.....
~
~
~-
~ ~
...... 21
......
'-""
..-
............. lclooorG .....
~~-and- ........ andbnlly __ .................
lllllllicoiDI. .. pomobd ~ ....... ~ c:oncillona
OoJC~U...:>~~~~.,Ihe-olhll**lrvU...Apeomon? •IIOUtt-No s~
. .. - TonloiiHugo98.JCIU-«CCIIIIIw~
Mesajul este ceva mai lung, folositi barele de defilare din dreapta
ferestrei pentru a-1 derula. (E suficient s~ dati click pe butonul cu
s~geata orientat~ Tn jos pentru a accepta conditiile ~i a continua.}
....-1 _ _ -t.PrloGEOOWN.._,Io_
___
._-.g~.-_..
1!liil .. _., .. ~
..__
-....v
-
· N- -
.. --"'<Mdocl.-.... _
....... a l . . . . . - . - t . - . g -....
.......,.,._..,
alhrCOIJIO!IIhtholltoronorlhe-alitt
.....-.....,beuoedlo-..co_pr _ _ ,_
<llad. I X• Ho
Sara de defilare va ar~ta c~t ati parcurs din text iar Tn final se va opri
j
LOSS
OF USE. DATA. OR PRORTS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
D -
ON I>Hf THEORY OF UASIUTY. WHETHER IN CONTRACT. STRICT UASIUTY. OR
TORT ONO.UDING NEGLIGENCE OR OTHERWISE) ARISING IN I>Hf'WAY OUT OF
THE
USE OF THIS SOFTWARE. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE. •
Do you accepe Ill the lennt ollhe poeceding Licence~? If you~ No, Setup
wl close To instal Hugo98, you II'IUII accepelhio ag~eement.
<lack tio
r Desmation Folder
I C:\talgs98 BJOWM.-- II
r.~
r No
<lack Cancel I
comenzile uzuale poate fi instalata selectand Yes In fereastra
urmatoare.
rYes
Daca n-ati gre$it nimic veti apasa pe butonul Next pentru a continua.
Altfel, folositi Back o data sau de mai multe ori pentru a revizui
optiunile precedente. Butonul Cancel i1 veti folosi daca doriti s~
abandonati instalarea. Altfel urmeaza copierea fi$ierelor .
~ B~t~ll 98 aod~: Rc~tett v1th coaaand ~~~ opt1on -98 to ~nebl~ e~tens1oo~
~ R~ading tll~ "C:\IIUGS98\llb\Ptdud~.ha'':
~ Hugs ~~SSlOO tot:
~ C : \HDGS98\11b\Pt~lud~.bs
fAI Typ~ : 7 toe belp
1!!!:1 Prelude>
(mJ
I
w
~
~
!!!!
Jl.euP1.oat.
P1.oat.in.g
II'W\Ot.or J
l!&onadl
List commands :?
Prelude> ?
l.IST OF COIOL\NDS lny =aAaru:l aay be abbreva~ed ~o c vhere
c 1s the hrs t character 1.ll the full naae
: load <f>lenaaes> load aodules froa spec1f1ed f1les
load c lear al l f1les excep~ prelude
also <hlenaaes> read addH1onal aodules
reload repea~ las~ load coaaand
·proJect <f>lenaae > use pro)ec~ f1 le
ech ~ <fllenaJle > ech ~ fll e
edH ed1 t las~ aodule
aodule <aodule> set aodule f or evalua~1ng express1ons
<expr> eva lua~e express1on
type <expr > pr1nt ~ype o f expre$$10n
? d1splay ~b1s l1st o f coaaands
s et cop~1ons> set coaaand line op~ 1 ons
set he lp on coaaand l 1ne opt1ons
nMes [ pa~ ] l1st naaes currently 1n scope
1nfo <naaes> descr ibe na•ed ob)ec~s
browse c-.odules> browse naaes defined 1n caodules >
f1 nd <na..e> ed1~ aodule con ta1ning def1n1 t 1on of naae
: Ico1Uland shell es~pe
cd d1r change directory
gc force garbage collection
ve rsion pr1n~ Hugs vers1on
qult ex1t Hug s 1nterpreter
Prelude >
j Bact.
~ . . . r:
fU ldil il.w Qo ,....,.... li•lp
~ ~ ~)
)<. ,
Adchul ~~
,.,.; ' ) . ! cw
-
lApp
- p- Undo o-.
3
LJ :___J _] LJ ~ r:l
.demoa. doco tCCn& lib IIC hugs-
~
'""'ot hlp
~ ~ ~ 0 ~
Instal l.JCeme RO<Idme rtmhugteKt u,,., ''"'
m
..muo·-
fii obJed(•) l£LJ$UB ..'1.:1 ,..~ -A.
I ~·
,,
~~
~;
Anexa B: lnstalarea Hugs pe un sistem PCLinuxOS
~. hug~98
..--,....---- - - - - -...
!
,._..:.;;-=-..'l<nji\X _ __
N9'< -
H 9<<- "'"".._.,.,
...,...
' " " , . , _ ~ <~P.J v• .... vtl ~"•. ,
H~
.,._.,_
Ncl~~_...,.
.....
w-e~" )OOJ\U0~41
~- ..
H 911><-~
4• t cripdeft • H,nblftf'fJM"'f(H ~ """'.ll"fWnft9 ~ f.ol ~( ...
0 "'"*'"'..
Nq~tJC'J'II'lf"oll.flr
·~~P"'9f<VM 1"his ~~W' ts ...~,~ ....,..li.\t..l91
I
-·-
Qo'III\'III!Nd Of'M)'
tt• ~.....
_. .....
K AJ..,._ YH
I•• t• ,. ~·~
l '-"' 1
.......
lrao<AO<S • • · ~,-, DleJ.._.,. fltONTIJC). ~~~Pt ~· •• ,t.-lt
11•.-4• .... ill' ~ik.a9e U'JU
....,.l"4 ~"'"''"' 1ret
0..
Olw\e-
.,., ' ••I"M , n•o II SUl.T-\?
Ge t J ll p ltftiJ f'h.1" 9 n t pt.\ln"AU'II.l. .<t /C.'l ~.,,, ... 1 . .2 112• .MttU.. IU.U UI
• •ttl'i"'•l U\l t..l 111 • J .) Ill e•.A.r.)•
( ~ Uu\liiQ · p" I ll¥" 1
"• •r.ar '"4
--
---
1110_...
_. .....
., ,.,...,..,....
l"~ Cdo ,_ ur'llmt.d)
------
Install: 1 APT: Deblan Package
• • ,.pof\ DUlAN rtOHTUI>; · t· 9f:l hl't•t\ · · Yn hug1>9S • ..c:ho aEWLT•\1
•~...ct1n9 '""Uft l.nh . • Doa~
kt1dug OtpH4euy " " O.•
fht to\\owing HE• P«k.atn • i\\ be lAU-~i\\c-d ;
llt.ttll
I p.aC' ..Ii9U Uptr~1Jtd. l ft('o~\y l.SUtl t(l I t('IIIOVed .and I Ut .p4)l.t!lt'd
......,.. ' • 911 115n1 ot arc h""
11Af hr u~'t•q 4)Mkl. of .odtUon•\ csu\. lP«It vlU bet •~C'd .
Wt : l hD:/Ittp .rl•"9·• t pc: h ne:tM/ 208VO\ • •9"98 210~lt1e- lllrd\ I12SH.IJ
rtuh t4 usns u ' ' ' ue I'S/J I
hec" ll"'9 IUifl I li~ l . ••
' ' IJNI""9 •
oo-...w,
.....aJ._
110-
191\0ttb01d
X 6U\Imtyft
1Htl4onocUI1in>t.. l
~ ... "'
II0--
'9N>'•ll)<'"'9
'9"«• bOld
X 6J~)'H
·I QQ Q[0_L lt'l-1~ »
·I G LQ.cation: ~ 5- l 0-interpretoare+lUGS
•g
' J
...
=- --=--
~
(pii\ (pii\
../ "
hugs98- libreadltne4-4 .3-
20021120-3m ... 7mdk.l586 .rpm
IMonParsing.hs - (5.6 KB) Backup File
0011103·
.rpm I;;;;;
P
halfStalS·1 .0·0.b7.
1mdlc.noarc h.rpm
Q
P
hld~_ld·cgi·l.50b2·
lmdk .noarch rpm
-
~HI.J r ~1rl, 50b2·1mdk.noarch ....
1mdk
,n
~
rp
helptool-2 4-14mdk
no.:Jrch.rpm
-
Q hplng2-2 o 0 ·0
beta54.2mdk.i586.r ..
~
, 10-1mdk Q -
P
hevea -1 05 -Smdk
t586.rpm
Q
P
hsftp -111 -Jmdk 1586
rpm
Q
I"
/mnUcdrom2/MandrakeJRPMS4/happy-l .l l -2mdk.i586.rpm
Install j; ~ancel
· -~ Que•y g fJ
'lbu are attempt1ng to run a command wh1ch
requires administrative priVIleges. but more
information is needed in order to do so.
(/;QK
Qone
AU s Packa~
Am.lt~ Radto (unowrs~) • hugs 91.zooeot.21-S.~ • zooeot.2H
Communocallon (" tmakt 3. 14-lubuntu1
Commo..roicat•on (multl-s (l h.uk~ll-modt 2.8.~1
Communication (uni~rst) 0 llbghc-src~xts-doc 1.11.1-3
Closs Platform 0 Ubghc-src~•LS-dt<o~ 1.11 1·3
Ctou Platfo;m (multlwrst 0 Ubghc-src~xts1)fof 1.11.1-3
Closs Platform (~st) 8 bbghc-e<IISOn-<OrMO< 1.2.1.3-8
DatabasM
DatabasM (UiliYffSt) A Huketl 98 i nterpr~~r
Dtbug
Ct't SU~nshot G~ Cha~9
Odlug (multl-st) ~
Debuq (UI\I~rst) Hugs Is ~n int~rpr~t~ for the non-stnct. pur~ly runcllo~l
programming
langua~ ~sk~ll This ~rslon of Hugs. Hugs 98. supports ntarly all
S«tions of
~ ~sk~l98 sp~CJfotton. as ~u as a numb~ or txt~lons
status
L ~arcll ~suits
I Architecture
10 P<lW~ list~. 1797lnstaU~. o broktn. o to lnstaiVupgr~~. 0 to r~mo~
0 ++ p =p
P ++ D=P
p ++ (q ++ r) =(p ++ q) ++ r
Exista. de asemenea o serie de relatii (proprieta.ti) care leaga. zeroul
mzero ~i operatia ·mplus· de bind(>>=).
In
Exista. situatii (de exemplu acelea cand rezultatul parsa.rii este o lista.
cu duplicate sau situatia cand ne intereseaza. sa. ga.sim doar o
singura analiza a unui ~ir) cand avem nevoie doar de primul element
din lista de solutii oferita. de doua. parsere, care altfel s-ar "aduna" cu
' mplus·. Se introduce atunci un alt operator de adunare, de data
~ aceasta determinist (1n sensul ca. parserele adunate astfel produc o
n
n lista. de cardinal eel mult 1).
n
Anexa G: Schema interpretorului monadic
- Parser
- Declaratiile termilor conform sintaxei
- Monada - cu ajutorul ei se face trecerea de Ia semantica asociata
sintaxei Ia valori. Ea este modelul de calcul, serve$te Ia
implementarea ma$inii virtuale $i poate fi schimbata cu alta tara a
modifica dramatic interpretorul.
- Multimea de valori care rezulta din evaluarea termilor
- Printerul - face operatia inversa parserului
- Environment-ul - nereprezentat in imagine - stocheaza valori ale
variabilelor (uneori stocheaza doar indicele pozitiei variabileleor
pe o stiva, daca a$a o stiva exista). Este similar cu lista de
variabile din LISP.
--Termii sunt :
-- variabile care au nume,
-- constante care au valoare Intreaga
-- suma de alti termi
-- o lambda expresie care contine un nume de variabila si un term
-- aplicarea unui term asupra altuia
-- (restrictiile ca primul sa fie fct. sc vcrifica la executie)
--- PLUS:
unNum (Num i) • i
unFun (Fun f) • f
[u
:)
-- 2) Operati~ cu valori si rezultat incapsulat monadic
-- varianta:
-- Fireste case mai pot adauga si alte operatii ...
----Interpretorul -propriuzis------------------------------------
interp .. Term-> Environment-> M Value
interp (Var x) e - lookupE x e
interp ICon il e - return INum il
-- scoate numarul din arbore si-1 face (cu
-- return) valoarc numerica impachetata monadic
I I
:
-Testarea---------- ------------------------------------------ ----
run :: Term-> String
run t ~ showM (interp t [) )
ln imaginea urmatoare se poate vedea executia unui program reprezentat de termul t1:
r.lra' x
SesSion Ed1t VieN Bookmarlcs Serunos Help
lntroducere:
Functii ~~ aritmetica:
0122: Scrieti functia care extrage elementul sau elementele din mijlocul
unei liste de lungime mal mare sau egala cu doi .
Monada:
0166: Prin ce difer~ instantele claselor din C++ de instantele claselor din
Haskell?
0170: Cu ce cuvant Tncep ramurile unui if. ..then ... else scris in interiorul
unei do-notatii ? (lndicatie: presupuneti ca pe fiecare ramura sunt mal
multe randuri de cod.)
0197: Cum au definit cei doi autori de mai sus operatiile bind ( » =) $i
return din monada parserelor ?
0203: Scrieti eel mai simplu parser, eel care consum~ din intrare un
caracter f~r~ s~-1 testeze.
[Bar-02] Barr, Michael; Wells, Charles; Toposes Triples and Theories, ver
1.1 , 7 nov 2002,
http://WWN .cwru .edu/artsci/mathlwells/pub/ttt.html
ftp://ftp.math .mcgill.ca/publbarr
http: /lwww.parsifalsoft.com/examples/xideklxidek/doclfourways.htm
[Pop-06] Papa, Dan ; Adaptive DFA based on array of sets- Univ. BacAu,
studii ~~ cercetAri ~tiintifice- Seria MatematlcA, Nr 15 (20050 pag 113-121