Introducere
Programarea funcțională este o paradigmă de programare în care încercăm să legăm totul în stil pur funcții matematice. Este un tip declarativ de stil de programare. Accentul său principal este pe ce să rezolvi, spre deosebire de un stil imperativ în care accentul principal este cum să rezolvi. Folosește expresii în loc de declarații. O expresie este evaluată pentru a produce o valoare, în timp ce o instrucțiune este executată pentru a atribui variabile. Aceste funcții au câteva caracteristici speciale discutate mai jos.
Programarea funcțională se bazează pe calculul Lambda:
Calculul Lambda este un cadru dezvoltat de Alonzo Church pentru a studia calculele cu funcții. Poate fi numit cel mai mic limbaj de programare din lume. Oferă definiția a ceea ce este computabil. Orice lucru care poate fi calculat prin calcul lambda este calculabil. Este echivalent cu mașina Turing prin capacitatea sa de a calcula. Acesta oferă un cadru teoretic pentru descrierea funcțiilor și evaluarea acestora. El formează baza aproape tuturor limbajelor de programare funcționale actuale.
Realitate: Alan Turing a fost un student al lui Alonzo Church care a creat mașina Turing care a pus bazele stilului de programare imperativ.
Limbaje de programare care acceptă programarea funcțională: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.
Concepte de programare funcțională:
adăugarea unui șir în java
- Funcții pure
- Recursiune Transparența referențială Funcțiile sunt de primă clasă și pot fi de ordin superior Variabilele sunt imuabile
Funcții pure: Aceste funcții au două proprietăți principale. În primul rând, produc întotdeauna aceeași ieșire pentru aceleași argumente, indiferent de orice altceva.
În al doilea rând, nu au efecte secundare, adică nu modifică niciun argument sau variabile locale/globale sau fluxuri de intrare/ieșire.
Proprietatea ulterioară se numește imuabilitate. Singurul rezultat al funcției pure este valoarea pe care o returnează. Ele sunt deterministe.
Programele realizate folosind programarea funcțională sunt ușor de depanat, deoarece funcțiile pure nu au efecte secundare sau I/O ascunse. Funcțiile pure facilitează, de asemenea, scrierea aplicațiilor paralele/concurente. Când codul este scris în acest stil, un compilator inteligent poate face multe lucruri - poate paraleliza instrucțiunile, poate aștepta să evalueze rezultatele când este nevoie de ele și poate memora rezultatele, deoarece rezultatele nu se schimbă niciodată atâta timp cât intrarea nu se schimbă.
exemplu de funcție pură:
sortarea unui arraylist java
sum(x, y) // sum is function taking x and y as arguments return x + y // sum is returning sum of x and y without changing them>
Recursie: Nu există bucle for sau while în limbaje funcționale. Iterația în limbaje funcționale este implementată prin recursivitate. Funcțiile recursive se numesc în mod repetat, până când ajunge la cazul de bază.
exemplu de funcție recursivă:
fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>
Transparență referențială: În programele funcționale, variabilele odată definite nu își schimbă valoarea pe tot parcursul programului. Programele funcționale nu au instrucțiuni de atribuire. Dacă trebuie să stocăm o valoare, definim în schimb variabile noi. Acest lucru elimină orice șansă de efecte secundare, deoarece orice variabilă poate fi înlocuită cu valoarea sa reală în orice punct de execuție. Starea oricărei variabile este constantă în orice moment.
Exemplu:
x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>
Funcțiile sunt de primă clasă și pot fi de ordin superior: Funcțiile de primă clasă sunt tratate ca variabile de primă clasă. Variabilele de primă clasă pot fi transmise funcțiilor ca parametru, pot fi returnate din funcții sau stocate în structuri de date. Funcțiile de ordin superior sunt funcțiile care iau alte funcții drept argumente și pot returna și funcții.
arhitectura linux
Exemplu:
show_output(f) // function show_output is declared taking argument f // which are another function f(); // calling passed function print_gfg() // declaring another function print('hello gfg'); show_output(print_gfg) // passing function in another function> Variabilele sunt imuabile: În programarea funcțională, nu putem modifica o variabilă după ce a fost inițializată. Putem crea variabile noi – dar nu putem modifica variabilele existente, iar acest lucru ajută cu adevărat la menținerea stării pe toată durata de rulare a unui program. Odată ce creăm o variabilă și setăm valoarea acesteia, putem avea deplină încredere știind că valoarea acelei variabile nu se va schimba niciodată.
Avantajele și dezavantajele programării funcționale
Avantaje:
- Funcțiile pure sunt mai ușor de înțeles deoarece nu schimbă nicio stare și depind doar de intrarea care le este dată. Indiferent de rezultatul pe care îl produc, este valoarea returnată pe care o oferă. Semnătura funcției lor oferă toate informațiile despre ei, adică tipul de returnare și argumentele lor.
- Capacitatea limbajelor de programare funcționale de a trata funcțiile ca valori și de a le transmite funcțiilor ca parametri face codul mai ușor de citit și de înțeles.
- Testarea și depanarea este mai ușoară. Deoarece funcțiile pure iau doar argumente și produc ieșire, ele nu produc modificări, nu iau intrare sau produc o ieșire ascunsă. Ele folosesc valori imuabile, astfel încât devine mai ușor să verifici unele probleme în programele scrise utilizează funcții pure.
- Este folosit pentru a implementa concurența/paralelismul, deoarece funcțiile pure nu schimbă variabilele sau orice alte date în afara acestuia.
- Adoptă evaluarea leneșă care evită evaluarea repetată deoarece valoarea este evaluată și stocată doar atunci când este nevoie.
Dezavantaje:
arian khan
- Uneori, scrierea de funcții pure poate reduce lizibilitatea codului.
- Scrierea de programe în stil recursiv în loc de a folosi bucle poate fi puțin intimidantă.
- Scrierea funcțiilor pure este ușoară, dar combinarea lor cu restul aplicației și operațiunilor I/O este o sarcină dificilă.
- Valorile imuabile și recursiunea pot duce la scăderea performanței.
Aplicatii:
- Este folosit în calcule matematice.
- Este necesar acolo unde este nevoie de concurență sau paralelism.
Realitate: Whatsapp are nevoie de doar 50 de ingineri pentru 900M utilizatorii deoarece Erlang este folosit pentru a implementa nevoile sale de concurență. Facebook folosește Haskell în sistemul său anti-spam.