Personal tools

Monade

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
Line 1: Line 1:
  +
[[Image:Haskelllogo-small-flag-RO-8.jpg|center|Haskell - Un limbaj functional pur - Monade]]
 
[[Category:Ro]]
 
[[Category:Ro]]
 
Monadele sunt structuri algebrice (M,>>= ,return) provenite din topologia algebrica sau/si din teoria categoriilor. Au intrat insa in "computer science" pe usa din dos :) a cresteri productivitatii muncii si extensibilitatii aplicatiilor.
 
Monadele sunt structuri algebrice (M,>>= ,return) provenite din topologia algebrica sau/si din teoria categoriilor. Au intrat insa in "computer science" pe usa din dos :) a cresteri productivitatii muncii si extensibilitatii aplicatiilor.

Revision as of 14:26, 4 October 2008

Haskell - Un limbaj functional pur - Monade

Monadele sunt structuri algebrice (M,>>= ,return) provenite din topologia algebrica sau/si din teoria categoriilor. Au intrat insa in "computer science" pe usa din dos :) a cresteri productivitatii muncii si extensibilitatii aplicatiilor.

Avantajul teoretic major al folosirii monadelor il constituie faptul ca pot separa DESCRIEREA unei succesiuni de calcule (pe care o exprimati in Haskell in do-notatie) atat de MODUL LOR DE INLANTUIRE (exprimat prin operatorul "bind") cat si de FORMA STRUCTURILOR DE DATE (exprimata prin constructorul de date al monadei si functia return care produce valori monadice).Practicianul programator percepe insa monadele si do-notatia ca un limbaj imperativ inclus in Haskell. Legile monadei garanteaza functionarea imperativa a do-notatiei, conform cu intuitia.

Uluitor este ca programatorii sunt obisnuiti cu faptul ca daca modifica structurile de date atunci trebuie sa modifice si programul care face calcule, prelucrari cu ele !! Si se supun acestei corvezi zi de zi !! Totusi daca legatura dintre universul structurii datelor s-ar face printr-un numar mic de functi si operatori (vom vedea ca se poate reduce la 2 operatii, >>= si return) atunci acest dezavantaj ar disparea !! La ACEST lucru sunt foarte folositoare monadele. Invatati deci programarea in stil monadic (eng- monadic style) si veti obtine o crestere neasteptata a productivitatii muncii de programare.

Cei interesati de programarea in Haskell isi pot imagina monadele ca niste structuri algebrice (M,>>= ,return) formate dintr-o multime de valori monadice (CARE NU ESTE M - dar vom vedea imediat ca este construita cu ajutorul lui M) si cei doi operatori numiti "bind" si "return".

M - este pentru programatorul in Haskell UN CONSTRUCTOR DE TIP POLIMORFIC. Ati mai intalnit asemenea constructori la liste si arbori. Dars e pot folosi si alte structuri, de exemplu Parsere, rezultand monada parserelor.

>>= este o functie polimorfica, definita in bibliotecile standard (vedeti clasa Monad) cu semnatura, cu tipul: >>= :: M a -> ( a -> M b) -> M b Ea serveste la combinarea unei valori monadice (provenita din ceva de tip a - variabil) cu o functie care pe baza unei valori de tip a obtine o valoare monadica M b (care incapsuleaza o valoare de tip b) si obtine in final un M b. Este o generalizare subtila a aplicarii de functie. De altfel la monada Id numita si monada identitate se vede imediat ca >>= e generalizarea aplicarii functiei.

Despre "return": Calculele cu valori monadice trebuie sa porneasca de la o valoare initiala. Functia polimorfica folosita in fiecare monada pentru a transforma valorile obisnuite, de diverse tipuri a, in valori monadice de tipul M a este functia return :: a -> M a EA SERVESTE LA INJECTAREA DE VALORI UZUALE IN UNIVERSUL MONADEI.

Avantajul practic al folosirii monadelor pentru programare in Haskell il constituie faptul ca ele definesc un fel de sublimbaj al Haskell-ului, cu nuanta imperativa. (Nu uitati cand programati in do notatie ca acolo unde "fluxul executiei" se ramifica - ex la un if - mai este nevoie de un "do" sau un return si pe cealalta ramura). E ca un fel de limbaj imperativ inclus in limbajul functional Haskell. Mai mult, programele scrise in el sunt simple deoarece puteti ascunde detalii ale lor in felul cum definiti operatorul >>= (pronunta"bind"). Exemplu: folositi o monada a starilor si toate detaliile mai putin semnificative le ascundeti in stare si in definirea lui ">>=". Cu ce se aseamana definirea lui bind la monada starilor ? Oarecum cu redefinirea lui ";" din limbajele imperative !

Un alt avantaj: Haskell fiind un limbaj functional pur, teoria spune ca nu puteti pur si simplu insera "print-uri" intr-o functie care se executa cu speranta ca ea va afisa outputuri utile pentru depanare (in caz ca sunteti invatati sa depanati in acest stil !). Monadele permit sa depasiti limitarea de mai sus: Puteti scrie functia in do-notatie in maniera monadica si folosi o monada cu stare si I/O (string de I/O) iar la finalul executiei veti gasi in stringul de I/O toate mesajele emise.

De unde sa incepeti studiul acestui nou stil de programare bazat pe calcule cu valori monadice ? Un frumos exemplu gasiti la pagina 407 in capitolul "Programming with actions" al volumului "The Craft of Functional Programming - second edition" semnat de Simon Thompson si publicat de Addison Wessley. Acolo Simon incepe prin a explica felul in care se transforma calculul sumei frunzelor unui arbore din maniera clasica, recursiva in maniera monadica (cvasi imperativa ca mod de scriere).Apoi arata cum se dezvolta aplicatia modificand monada,fara efecte majore asupra codului scris in do-notatie deoarece el pastreaza sablonul prelucrarii arborelui : prelucrare nod , prelucrare subarbore stang, prelucrare subarbore drept, returnare rezultat compus.

Cei interesati de aspectele matematice ale monadelor pot consulta (in engleza) celebrul volum de Prof.Em. Michael Barr si Prof.Em. Charles Wells - Toposes, Triples and Theories,de pe pagina sa de internet. Sunteti rugati insa sa nu-l redistribuiti !!

Nota: Pe vremea cand a fost scris volumul monadele se numeau Triple (eng. Triples).

IN CONCLUZIE - monadele sunt structuri algebrice (M, >>=, return)

  M e un constructor de tip 
  >>= :: M a -> (a -> M b) -> M b
  return :: a-> M b e cel ce injecteaza valori in universul monadei

- pe baza lor s-a dezvoltat scrierea imperativa numita do-notatie a carei functionare e garantata de legile monadei - definirea monadei in Haskell se face prin instantiere, din clasa monad

Aceasta pagina este in dezvoltare sau pur si simplu mai trebuie dezvoltata.Pana atunci Dan Popa va invita la cursurile si seminariile sale de la Universitatea din Bacau, Romania.Prima universitate din Romania unde se preda Haskell.


Pagina indexata la indexul Categories:Ro


<= Inapoi la inceputul paginii principale Ro/Haskell.

<- Inapoi la Intrebarile incepatorului Ro/Haskell.