Difference between revisions of "Ro/Haskell"

From HaskellWiki
Jump to navigation Jump to search
m
Line 12: Line 12:
   
 
== Introducere ==
 
== Introducere ==
Haskell este un limbaj de uz general, din categoria limbajelor functionale pure (fara instructiuni imperative sau producatoare de efecte laterale). Foloseste Lazy Evaluation.Beneficiaza de un sistem de tipuri revolutionar, cu tipuri polimorfice si clase de tipuri. Permite programarea cu clase si instante de clase definite utilizator. Are o sintaxa bidimensionala (bazata pe notiunea de Layout). Sintaxa bidimensionala face programele mult mai clare decat echivalentele lor in LISP (netipizat si cu multe paranteze: LISP = Limbajul InSuportabilelor Paranteze) sau cele in Scheme ori ML. Alte plusuri sunt tipizarea stricta, existenta [[monade]]lor si a do-notatiei (o scriere cvasi imperativa posibila intr-un limbaj functional pur) precum si existenta listelor infinite si a "multimilor ordonate" definite descriptiv, numite in manualele de Haskell (in limba engleza) "list comprehensions".
+
Haskell este un limbaj de uz general, din categoria limbajelor functionale pure (fara instructiuni imperative sau producatoare de efecte laterale). Foloseste Lazy Evaluation. Beneficiaza de un sistem de tipuri revolutionar, cu tipuri polimorfice si clase de tipuri. Permite programarea cu clase si instante de clase definite utilizator, clasele fiind multimi de structuri algebrice (adica mai mult decat multimi de obiecte).
  +
  +
Haskell este DEOSEBIT: El are o sintaxa bidimensionala (bazata pe notiunea de Layout) asa ca simpla aliniere corecta pe verticala va scuteste de paranteze ! Iar daca puneti un spatiu in PLUS nu e o greseala. Sintaxa bidimensionala face programele mult mai clare decat echivalentele lor in LISP (netipizat si cu multe paranteze: LISP = Limbajul InSuportabilelor Paranteze) sau cele in Scheme ori ML. Alte plusuri sunt tipizarea stricta, existenta [[monade]]lor si a do-notatiei (o scriere cvasi imperativa posibila intr-un limbaj functional pur) precum si existenta listelor infinite si a "multimilor ordonate" definite descriptiv, numite in manualele de Haskell (in limba engleza) "list comprehensions".
   
 
Productivitatea programarii in Haskell este net superioara altor limbaje, un algoritm [[Quicksort]] scriindu-se in doar 3-4 linii de program nu in 30-40 ca in C sau C++. Dati un click pe link-ul [[Quicksort]] pentru a-l vedea.
 
Productivitatea programarii in Haskell este net superioara altor limbaje, un algoritm [[Quicksort]] scriindu-se in doar 3-4 linii de program nu in 30-40 ca in C sau C++. Dati un click pe link-ul [[Quicksort]] pentru a-l vedea.
   
Unul din motivele pentru care Haskell este atat de productiv este posibilitatea de a lucra cu functii de nivel superior, polimorfice, operand inclusiv pe structuri de date definite inductiv. Acele structuri de date beneficiaza de functii de afisare si comparare (si nu numai) generate automat prin "deriving" ori definite de utilizator.
+
Unul din motivele pentru care Haskell este atat de productiv este posibilitatea de a lucra cu functii de nivel superior, polimorfice, operand inclusiv pe structuri de date definite inductiv. Acele structuri de date beneficiaza de functii de afisare si comparare (si nu numai) generate automat prin "deriving" ori definite de utilizator.
  +
  +
V-ati batut capul nu o data sa rescrieti rutinele de afisare ale unor structuri de date compuse (liste de arbori cu noduri perechi de ... samd) care se schimbau pe masura ce dezvoltati proiectul ? Ati refacut mereu functiile de comparatie pentru astfel de structuri de date compuse ? Folositi Haskell si adaugati declaratiilor de date "deriving Show" respectiv "deriving Eq" (Iar lista nu se opreste aici.) Haskell face automat restul si tipul nou creat capata din clipa declararii functiile de afisare sau comparare ce-i sunt necesare fara sa le scrieti dumneavoastra ! Dar le puteti rescrie daca nu va plac.
  +
 
Exista o multime de compilatoare si interpretoare pentru Haskell si sunt disponibile gratuit. Hugs e un interpretor bun pentru primele lectii de Haskell. GHC este un compilator pentru proiecte profesionale. Cititi va rog si paragraful despre: Interpretoare si compilatoare de Haskell disponibile, tot pe aceasta pagina.
  +
  +
Apropos: Daca va intereseaza teoria automatelor si limbajelor formale sau metode de transcriere a structurilor de date dintr-un format in altul, Haskell este un instrument excelent. Un translator de la o sintaxa la alta se scrie uimitor de repede, in cateva ore. Ba chiar si un mic limbaj de programare ! Dar nu uitati mai inainte sa cititi ceva despre teoria limbajelor formale. Capitolul dedicat gramaticilor de tip 2 (Context Free Grammmars) din ierarhia lui Chomsky in primul rand dar si celelalte lucrari ale lui Noam Chomsky.
   
Exista o multime de compilatoare si interpretoare pentru Haskell si sunt disponibile gratuit. Cititi si paragraful despre: Interpretoare si compilatoare de Haskell disponibile, tot pe aceasta pagina.
 
   
 
== Despre Haskell dorim sa prezentam...==
 
== Despre Haskell dorim sa prezentam...==
Line 30: Line 37:
 
* [http://haskell.org/hoogle Hoogle,Motorul de cautare pentru functii Haskell din diversele biblioteci se afla aici, la http://haskell.org/hoogle.] Folositi [http://haskell.org/hoogle Hoogle] pentru a invata despre noi functii de biblioteca si pentru a descifra programe. <br> http://www.haskell.org/hoogle/res/hoogle_large.png <br> Puteti cauta atat dupa denumirea functiei cat si dupa tipul acesteia. Exemple: cautati "map" sau "(a -> b) -> [a] -> [b]" ori, de ce nu, chiar tipuri cu preconditii "Ord a => [a] -> [a]". Rezultatele sunt in engleza :(
 
* [http://haskell.org/hoogle Hoogle,Motorul de cautare pentru functii Haskell din diversele biblioteci se afla aici, la http://haskell.org/hoogle.] Folositi [http://haskell.org/hoogle Hoogle] pentru a invata despre noi functii de biblioteca si pentru a descifra programe. <br> http://www.haskell.org/hoogle/res/hoogle_large.png <br> Puteti cauta atat dupa denumirea functiei cat si dupa tipul acesteia. Exemple: cautati "map" sau "(a -> b) -> [a] -> [b]" ori, de ce nu, chiar tipuri cu preconditii "Ord a => [a] -> [a]". Rezultatele sunt in engleza :(
   
  +
== Aventura lansari comunitatii Ro-Haskell ==
 
* Introducerea limbajului Haskell in presa de specialitate informatica fie ca era vorba despre reviste sau carti s-a dovedit o adevarata aventura. Editurile de exemplu declarau doar ca sunt interesate de cartile despre noile limbaje dar dore in principal sa va vanda doar carti despre HTML si C. Am primit un ajutor nesperat din partea revistei MyLinux care a initiat primul sondaj din Romania privind intereul cititorilor pentru un limbaj atat de nou si productiv. Au inceput cu: Doriti un articol despre Haskell ? Ati auzit de Haskell ? - Sondajul exista inca pe site-ul revistei MyLinux actualmente comasata cu MyHardware. [http://www.myl.ro/forum/index.php?showtopic=1170 - Sondaj din 2005]. Pe scurt cateva pareri incurajatoare, limbajul in care sunt exprimate apartine autorilor lor:
+
* Introducerea limbajului Haskell in presa de specialitate informatica fie ca era vorba despre reviste sau carti s-a dovedit o adevarata aventura. Editurile de exemplu doar declarau ca sunt interesate de cartile despre noile limbaje dar doreau si doresc in principal sa va vanda doar carti despre HTML, WEB si C. Am primit un ajutor nesperat din partea revistei MyLinux care a initiat primul sondaj din Romania privind interesul cititorilor pentru un limbaj atat de nou si productiv. Au inceput cu: Doriti un articol despre Haskell ? Ati auzit de Haskell ? - Sondajul exista inca pe site-ul revistei MyLinux actualmente comasata cu MyHardware. [http://www.myl.ro/forum/index.php?showtopic=1170 - Sondaj din 2005]. Pe scurt cateva pareri incurajatoare, limbajul in care sunt exprimate apartine autorilor lor:
 
** Opinie: "Unii spun ca e chiar mai "object-oriented" decat Python.O prezentare a acestuia intr-un limbaj accesibil tuturor ar fi interesanta."
 
** Opinie: "Unii spun ca e chiar mai "object-oriented" decat Python.O prezentare a acestuia intr-un limbaj accesibil tuturor ar fi interesanta."
 
** Opinie: "Da, e un limbaj destul de mişto. Chiar ar fi util pentru cei care n-au auzit de el."
 
** Opinie: "Da, e un limbaj destul de mişto. Chiar ar fi util pentru cei care n-au auzit de el."
 
** Opinie: "Pare interesant , din cate stiu compilatorul de Perl6 este scris in haskel. [http://www.pugscode.org/ ]"
 
** Opinie: "Pare interesant , din cate stiu compilatorul de Perl6 este scris in haskel. [http://www.pugscode.org/ ]"
  +
* Multumesc pe aceasta cale echipei care a pus la dispozitie infrastructura site-ului si a asigurat astfel web hosting-ul (Wiki etc).
 
 
   
 
== Utilizarea ca instrument de realizare a interpretoarelor ==
 
== Utilizarea ca instrument de realizare a interpretoarelor ==
Line 87: Line 93:
 
* [http://cvs.haskell.org/Hugs/downloads/hugs.pdf Despre Hugs la http://cvs.haskell.org/Hugs/downloads/hugs.pdf]
 
* [http://cvs.haskell.org/Hugs/downloads/hugs.pdf Despre Hugs la http://cvs.haskell.org/Hugs/downloads/hugs.pdf]
 
* Grammars and Parsing de Johan Jeuring si Doaitse Swierstra a fost/este disponibila la:[http://lampwww.epfl.ch/~michelou/links/compiler/files/MAIN.pdf - Download! Cititi din ea neaparat capitolele urmatoare: ]
 
* Grammars and Parsing de Johan Jeuring si Doaitse Swierstra a fost/este disponibila la:[http://lampwww.epfl.ch/~michelou/links/compiler/files/MAIN.pdf - Download! Cititi din ea neaparat capitolele urmatoare: ]
  +
 
3.1 The type 'Parser' pp 47
 
3.1 The type 'Parser' pp 47
 
3.2 Elementary parsers pp 49
 
3.2 Elementary parsers pp 49

Revision as of 15:58, 19 January 2007

Haskell - Un limbaj functional pur

Limbajul functional succesor al LISP-ului, Scheme-ului si ML-ului !!!
Cel mai productiv limbaj functional ! (Pagina actualizata pe 19.ian.2007)


Introducere

Haskell este un limbaj de uz general, din categoria limbajelor functionale pure (fara instructiuni imperative sau producatoare de efecte laterale). Foloseste Lazy Evaluation. Beneficiaza de un sistem de tipuri revolutionar, cu tipuri polimorfice si clase de tipuri. Permite programarea cu clase si instante de clase definite utilizator, clasele fiind multimi de structuri algebrice (adica mai mult decat multimi de obiecte).

Haskell este DEOSEBIT: El are o sintaxa bidimensionala (bazata pe notiunea de Layout) asa ca simpla aliniere corecta pe verticala va scuteste de paranteze ! Iar daca puneti un spatiu in PLUS nu e o greseala. Sintaxa bidimensionala face programele mult mai clare decat echivalentele lor in LISP (netipizat si cu multe paranteze: LISP = Limbajul InSuportabilelor Paranteze) sau cele in Scheme ori ML. Alte plusuri sunt tipizarea stricta, existenta monadelor si a do-notatiei (o scriere cvasi imperativa posibila intr-un limbaj functional pur) precum si existenta listelor infinite si a "multimilor ordonate" definite descriptiv, numite in manualele de Haskell (in limba engleza) "list comprehensions".

Productivitatea programarii in Haskell este net superioara altor limbaje, un algoritm Quicksort scriindu-se in doar 3-4 linii de program nu in 30-40 ca in C sau C++. Dati un click pe link-ul Quicksort pentru a-l vedea.

Unul din motivele pentru care Haskell este atat de productiv este posibilitatea de a lucra cu functii de nivel superior, polimorfice, operand inclusiv pe structuri de date definite inductiv. Acele structuri de date beneficiaza de functii de afisare si comparare (si nu numai) generate automat prin "deriving" ori definite de utilizator.

V-ati batut capul nu o data sa rescrieti rutinele de afisare ale unor structuri de date compuse (liste de arbori cu noduri perechi de ... samd) care se schimbau pe masura ce dezvoltati proiectul ? Ati refacut mereu functiile de comparatie pentru astfel de structuri de date compuse ? Folositi Haskell si adaugati declaratiilor de date "deriving Show" respectiv "deriving Eq" (Iar lista nu se opreste aici.) Haskell face automat restul si tipul nou creat capata din clipa declararii functiile de afisare sau comparare ce-i sunt necesare fara sa le scrieti dumneavoastra ! Dar le puteti rescrie daca nu va plac.

Exista o multime de compilatoare si interpretoare pentru Haskell si sunt disponibile gratuit. Hugs e un interpretor bun pentru primele lectii de Haskell. GHC este un compilator pentru proiecte profesionale. Cititi va rog si paragraful despre: Interpretoare si compilatoare de Haskell disponibile, tot pe aceasta pagina.

Apropos: Daca va intereseaza teoria automatelor si limbajelor formale sau metode de transcriere a structurilor de date dintr-un format in altul, Haskell este un instrument excelent. Un translator de la o sintaxa la alta se scrie uimitor de repede, in cateva ore. Ba chiar si un mic limbaj de programare ! Dar nu uitati mai inainte sa cititi ceva despre teoria limbajelor formale. Capitolul dedicat gramaticilor de tip 2 (Context Free Grammmars) din ierarhia lui Chomsky in primul rand dar si celelalte lucrari ale lui Noam Chomsky.


Despre Haskell dorim sa prezentam...

Aventura lansari comunitatii Ro-Haskell

  • Introducerea limbajului Haskell in presa de specialitate informatica fie ca era vorba despre reviste sau carti s-a dovedit o adevarata aventura. Editurile de exemplu doar declarau ca sunt interesate de cartile despre noile limbaje dar doreau si doresc in principal sa va vanda doar carti despre HTML, WEB si C. Am primit un ajutor nesperat din partea revistei MyLinux care a initiat primul sondaj din Romania privind interesul cititorilor pentru un limbaj atat de nou si productiv. Au inceput cu: Doriti un articol despre Haskell ? Ati auzit de Haskell ? - Sondajul exista inca pe site-ul revistei MyLinux actualmente comasata cu MyHardware. - Sondaj din 2005. Pe scurt cateva pareri incurajatoare, limbajul in care sunt exprimate apartine autorilor lor:
    • Opinie: "Unii spun ca e chiar mai "object-oriented" decat Python.O prezentare a acestuia intr-un limbaj accesibil tuturor ar fi interesanta."
    • Opinie: "Da, e un limbaj destul de mişto. Chiar ar fi util pentru cei care n-au auzit de el."
    • Opinie: "Pare interesant , din cate stiu compilatorul de Perl6 este scris in haskel. [1]"
  • Multumesc pe aceasta cale echipei care a pus la dispozitie infrastructura site-ului si a asigurat astfel web hosting-ul (Wiki etc).

Utilizarea ca instrument de realizare a interpretoarelor

  • Datorita modului atat de simplu in care se pot defini in Haskell elementele unui translator limbajul Haskell se recomanda de la sine ca un DSL (domain specific language) pentru realizarea interpretoarelor si compilatoarelor. Astfel, in Haskell se definesc foarte usor:
    • Textul de intrare vazut ca string si simultan ca lista de caractere (in Haskell tipul String avand ambele semnificatii)
    • Atomii lexicali sunt recunoscuti de parsere specializate, deja existente in biblioteci cum sunt ParseLib si Parsec (sau altele ...)
    • Gramaticile, inclusiv cele ambigue sunt imediat transcrise (in asa-zisa do-notatie) sub forma unor secvente de parsere corespunzatori neterminalelor gramaticii. Alternativa "|" beneficiaza de un operator special (+++ in ParseLib) Suportul teoretic, structura algebrica ce permite combinarea efectelor parserelor este Monada Parserelor.
    • Arborii sintactici, inclusiv cei polimorfici, se transcriu imediat in Haskell folosind declaratia "data" (destinata tipurilor utilizator). Descrierea structurilor de date pentru reprezentarea arborilor sintactici se poate face pe unul - doua -trei randuri. Deoarece in Haskell la o declaratie "data" se poate adauga "deriving Show", noul tip de date va fi implicit inzestrat cu functie de afisare, pe care programatorul nu mai este obligat s-o scrie el. Simpla modificare a declaratiei "data" a arborilor modifica automat (transparent) functia de afisare. Ideal pentru realizarea prototipurilor.
    • Semantica se poate transcrie in do-notatie, dar folosind de obicei o alta monada decat monada parserelor. Nu sunt necesari operatori specializati pentru lifting-ul functiilor uzuale in universul monadei, asa cum se proceda pe vremea cand Espinosa scria la teza sa de doctorat, celebra teza despre "Semantic Lego". Descarcati de aici Transcrierea_semanticii_in_do_notatie.pdf un capitol dintr-o carte de Dan Popa, destinat a introduce cititorul in tehnicile de exprimare a semanticilor in do-notatie(163KB, MIME type: application/pdf). Dovedeste totodata superioritatea Haskell-ului asupra altor limbaje functionale mai vechi (LISP,SCHEME), in priviinta posibilitatilor de a transcrie semantici in el si explica necesitatea indeplinirii Legilor Monadei.
    • Prelucrarile recursive de arbori atat de necesare la parcurgerea arborilor, la listarea unui arbore sintactic (pretty printing) se scriu imediat deoarece Haskell permite definirea de functii recursive, ca succesiuni de ecuatii.
  • La urma dar nu in cele din urma: Compilatorul de Haskell GHC este el insusi scris in Haskell. Ceea ce spune tot ce este de spus despre Haskell ca limbaj (DSL) de scriere a compilatoarelor.
  • Cum sa scrii un mic limbaj, aicio implementare de Scheme.

Interpretoare si compilatoare disponibile - pagini in engleza

Exista o multime de compilatoare si interpretoare pentru Haskell si sunt disponibile gratuit: Hugs (interpretor), GHC (compilator), Hellium (mediu de instruire) si altele. O serie de distributii Linux includ interpretorul Hugs (ex: Mandrake 10.0), altele il ofera pentru download de pe site-ul distributiei (ex: PC Linux OS 9). Unele permit instalarea imediata a interpretorului sau compilatorului de Haskell (ex: Suse 9.x functioneaza cu cele doua binare din distributia Mandrake 10.0).Iar lista nu se opreste aici. Mediul de dezvoltare Kdevelopment permite si realizarea de proiecte in Haskell (are chiar sablon de proiect inclus, pregatit) dar nu uitati sa instalati compilatorul GHC. Versiuni de WinHugs sunt de asemenea disponibile pe platforma Windows. Compilatorul Haskell GHC poate, cu ajutorul unui plug-in special sa lucreze impreuna cu mediul de dezvoltare ECLIPSE ! Nici Visual Studio-ul nu e uitat, exista versiuni in care se poate lucra cu Hasekll. Un instrument util lansat recent este Visual Haskell

Lucrari in limba romana

  • Cum puteti scrie un mic asamblor adaptabil in Haskell 98:Popa, Dan; An assembler in a nutshell - Proceedings of the 30th annual Congress of The American-Romanian
    Academy of Art and Sciences (ARA), Academia de Studii Economice din Moldova,
    2005, p. 196-198 x 2 coloane, ISBN 9975-75-313-2 Versiunea in limba romana a lucrarii, in format de capitol de carte. Bibliografia nu este inclusa dar notiunile
    folosite sunt notiuni fundamentale de teoria categoriilor care pot fi gasite
    in orice carte de Teoria Categoriilor.


Carti in pregatire

  • Translatoare scrise in Haskell 98 pentru securizarea sistemelor on-line

Gasiti in sectiunea Capitole de manual a site-ului parti din DRAFT-ul unui manual despre Haskell si folosirea lui la scrierea unor translatoare utile in securizarea sistemelor on-line. Utilizati-le ca un set de lectii de initiere in Haskell desi unele capitole necesare (monade , I/O etc) nu sunt incluse. Erata si alte sugestii de imbunatatire... vom adauga poate cu alta ocazie.

Vestea proasta: Datorita felului cum se puncteaza asemenea activitati la Universitatea Bacau, impartind punctajul la numarul autorilor si netinind cont de valoarea cartii sau de faptul ca versiunea romaneasca a unei carti libere trebuie integral rescrisa probabil acest proiect va fi amanat ca fiind neprioritar. Pacat :(


Distributii Linux de Download apreciate

Lista urmatoare nu este nici pe departe completa.

  • Mandrake 10.0 - include Hugs in format binar, gata de a fi instalat. In plus

este si o buna platforma pentru laboratorul de Sisteme de Calcul cu Linux si nici nu solicita PC-uri puternice.

  • Mandriva 10.2 - desi nu mai include Hugs puteti folosi binarele Hugs de la distributia de mai sus (Mandrake 10.0). Nu uitati sa instalati si biblioteca libreadline.so.4 de pe CD-ul 1.
  • Suse 9.x - am putut instala la fel de usor Hugs oferit impreuna cu Mandrake 10.0.
  • PC Linux OS 9 - cu riscul de a gresi afirm ca Hugs era disponibil ca pachet de programe downloadabile de pe site-ul distributiei.

Exista si alte distributii Linux care includ Hugs sau mai puternicul GHC. De asemenea exista portari profesionale pe Solaris.

Biblioteca despre Haskell, Hugs si Limbaje Formale On Line

Nici nu va inchipuiati cate materiale exista pe Internet. Voi incerca sa intretin o lista de carti si articole disponibile pe Internet, in format PDF sau macar sa indic pe cele mai valoroase.

3.1 The type 'Parser'    pp 47
3.2 Elementary parsers   pp 49
3.3 Parser combinator    pp 52
and more ... including 
5.1 Finite state automata pp 85
and more ...


<= Inapoi la inceputul paginii principale Ro/Haskell