- Idei de bază
- caracteristici
- Funcții pure
- Caracteristici de primă clasă
- Transparență referențială
- Recursivitate
- inflexibilitate
- Exemple
- Abordări imperative și declarative
- Funcții pure
- Funcționează ca obiecte de primă clasă
- Avantaj
- Mai scurt și mai ușor de înțeles
- Fără flux de control
- Dezavantaje
- Aplicații
- Metodologie funcțională
- Limbi care acceptă programarea funcțională
- D
- Erlang
- Haskell
- ML
- Obiectiv Caml
- Sistem
- Referințe
Cele funcționale de programare corespunde programării de model se bazează pe conceptul de a afirma comportamentul unui program ca un model matematic funcțional , mai degrabă decât secvențe explicite de instrucțiuni pentru un procesor, care este conceptul de bază în programarea imperativă.
Limbajul funcțional pune accentul pe enunțuri și termeni și nu pe executarea de instrucțiuni. În această programare, rezultatul va depinde doar de parametrii trecuți unei funcții, spre deosebire de alte tipuri care se supun unui stat local sau global.
Diagrama funcționării funcției de mapare în limbajul de programare funcțional Haskell. Sursa: By Pluke - Lucrare proprie, CC0 commons.wikimedia.org.
Numele său provine de la funcțiile matematice, care sunt alocarea unui set de intrări unui set de ieșiri. O funcție matematică nu realizează cu adevărat nicio lucrare, ci descrie mai degrabă modelul unui proces, explicând printr-o formulă ce produce un set de intrări într-o funcție.
Idei de bază
Temelia pe care s-a bazat programarea funcțională a fost calculul lambda, care a fost dezvoltat în deceniul al treilea al secolului XX pentru a defini și aplica funcții. LISP a fost primul limbaj de programare de acest gen, conceput în 1960.
Deși majoritatea limbajelor de programare constau din intrări, ieșiri și variabile externe care pot fi setate sau utilizate din funcții, programarea funcțională evită acest lucru. Ideea este că de fiecare dată când o funcție este apelată cu aceiași parametri, ar trebui să returneze aceeași valoare.
caracteristici
Limbile de programare funcționale se numesc aplicații, deoarece funcțiile sunt aplicate parametrilor lor, precum și declarative și non-procedurale, deoarece definițiile specifică ce trebuie calculat și nu modul în care este calculat.
Funcții pure
O funcție este pură atunci când nu are efecte secundare observabile, cum ar fi modificarea variabilelor externe, modificările sistemului de fișiere ș.a.
Aceste funcții sunt considerate convingătoare, deoarece nu vor modifica în mod expres nicio variabilă de care ar putea depinde alte părți ale codului la un moment dat. S-ar părea incomod să se codeze aceste constrângeri, dar aceste funcții ar trebui considerate a fi deterministe, previzibile și compozibile.
Caracteristici de primă clasă
Funcțiile sunt considerate ca valori care pot fi atribuite variabilelor, astfel încât acestea pot fi transmise și returnate din alte funcții. Adică, o funcție poate fi folosită ca și cum ar fi un parametru sau ca o valoare care este returnată.
Aceasta implică faptul că funcția poate fi transmisă ca atare, mai degrabă decât doar rezultatul funcției. De exemplu, ia în considerare funcția double (x), care returnează de două ori valoarea parametrului de intrare. Astfel, dubla (2) ar reveni 4.
Deoarece este o funcție de primă clasă, codul (dublu (dublu (2)) ar fi același cu codul dublu (4). Aceasta vă permite să cuibăriți o funcție ca parametru al alteia, etc.
Transparență referențială
Se referă la faptul că în acest model de programare nu există declarații de atribuire. Adică trebuie să definiți variabile noi dacă doriți să stocați valori suplimentare. Prin urmare, starea unei variabile este constantă în orice moment.
Aceasta elimină cea mai mică posibilitate de efecte nedorite, deoarece orice variabilă poate fi înlocuită cu valoarea sa reală în orice punct de execuție a programului.
Recursivitate
În programarea funcțională nu există bucle „pentru” și „în timp ce”. În schimb, iterația se bazează pe recurs. Recursiunea este implementată folosind funcții recursive, care se numesc în mod repetitiv până la atingerea cazului de bază.
inflexibilitate
Variabilele sunt imuabile, adică nu este posibilă modificarea unei variabile după ce a fost inițiată. Deși puteți crea o nouă variabilă, modificarea variabilelor existente nu este permisă.
Exemple
Abordări imperative și declarative
Cu un exemplu, puteți analiza diferența dintre aceste abordări, efectuând aceeași operație în ambele aranjamente, care este de a filtra numerele impare dintr-o listă, în timp ce înlocuind 5 pentru numere uniforme mai mici de 5.
Este același calcul, cu același rezultat. Cu toate acestea, după cum puteți vedea, codul imperativ este verbos și nu este clar imediat. Pe de altă parte, abordarea declarativă este lizibilă și explicită, deoarece se concentrează pe ceea ce doriți să obțineți.
Funcții pure
Ceea ce este definit ca funcții pure și impure poate fi clarificat cu câteva exemple de bază:
Funcționează ca obiecte de primă clasă
Înseamnă să utilizați funcții în același mod în care sunt utilizate datele. Prin urmare, ele pot fi transmise ca parametri la o altă funcție. În următorul exemplu, funcția int poate fi transmisă ca parametru la funcția de hartă:
>>> listă (hartă (int,))
Ele pot fi atribuite variabilelor și returnate. De exemplu, în codul următor puteți atribui funcția hello_world, apoi puteți executa variabila ca funcție.
Avantaj
- Concentrați-vă pe ceea ce doriți să obțineți (declarativ) și nu pe modul de realizare (imperativ).
- Nu conțin instrucțiuni de atribuire, astfel încât după ce variabilelor li se dă o valoare, nu se vor mai schimba. Prin urmare, programele funcționale nu conțin efecte secundare.
- Fluxul logic este clar, deoarece starea este mai puțin dispersată și nu este modificată implicit.
- Susține conceptul de evaluare leneș, ceea ce înseamnă că valoarea este evaluată și stocată numai atunci când este necesar.
- Deoarece funcțiile pure nu schimbă nicio stare și depind complet de intrare, acestea sunt ușor de înțeles. Valoarea de returnare dată de astfel de funcții este aceeași cu rezultatul produs de acestea.
- Datorită naturii funcțiilor pure pentru a evita ca variabilele sau orice alte date externe să se schimbe, implementarea concurentei devine eficientă.
- Funcțiile sunt tratate ca valori, trecând la alte funcții ca parametri. Acest lucru îmbunătățește înțelegerea și lizibilitatea codului.
- Funcțiile pure iau parametrii o dată, producând o ieșire imuabilă. Utilizarea valorilor inalterabile facilitează depurarea și testarea.
Mai scurt și mai ușor de înțeles
Sunt mai scurte și mai ușor de înțeles decât imperativele. Studiile au arătat că productivitatea medie a programatorului în ceea ce privește liniile de cod este mai mult sau mai puțin aceeași pentru orice limbaj de programare, traducându-se în productivitate mai mare.
Fără flux de control
Apelarea unei funcții nu poate avea un efect diferit de calculul rezultatului acesteia. Aceasta exclude o sursă importantă de erori, ceea ce face ca ordinea de execuție să nu fie relevantă, deoarece niciun efect secundar nu poate modifica valoarea unei expresii și poate fi evaluat în orice moment.
Programatorul este scutit de povara instituirii unui flux de control. Deoarece expresiile pot fi evaluate în orice moment, variabilele pot fi înlocuite cu valorile lor.
Această autonomie face ca programele funcționale să fie mai gestionabile din punct de vedere matematic decât programele convenționale.
Dezavantaje
- Paradigma de programare funcțională nu este simplă, de aceea este dificil să înțeleagă un începător.
- Este dificil de întreținut, deoarece multe obiecte evoluează în timpul codificării.
- În unele cazuri, scrierea funcțiilor pure determină o reducere a lizibilității codului.
- Valorile imuabile în combinație cu recursiv pot duce la o reducere drastică a performanței sistemului.
- Reutilizarea este foarte complicată și necesită refactorizare constantă.
- Scrierea programelor într-un stil recursiv în loc de a folosi bucle sau bucle poate fi o sarcină foarte descurajantă.
- Este posibil ca obiectele să nu reprezinte corect problema.
- Deși scrierea funcțiilor pure se dovedește a fi simplă, combinarea lor cu restul aplicației și cu operațiile de intrare / ieșire este destul de dificilă
Aplicații
Programarea inteligenței artificiale se face în limbaje de programare funcționale, iar tehnicile de inteligență artificială migrează către aplicații din lumea reală.
De asemenea, excelează în implementarea modelelor matematice complexe. Din acest motiv, una dintre principalele utilizări ale limbajelor funcționale a fost în mod tradițional academică. Este util pentru dezvoltarea specificațiilor executabile și a implementărilor prototipului.
Multe limbaje funcționale excelează și la implementarea procesării paralele. Acest lucru se datorează capacității sale de a profita de funcții pure, care întorc întotdeauna aceeași valoare indiferent de ordinea în care sunt executate.
Metodologie funcțională
WhatsApp utilizează limbajul de programare Erlang, care urmează modelul funcțional de programare, permițând astfel mai mult de o sută de angajați să se ocupe de datele aparținând aproximativ 1,6 miliarde de persoane.
Un alt purtător important al stilului de programare funcțional este Haskell. Este folosit de Facebook în sistemul său antispam. Chiar și JavaScript, unul dintre cele mai utilizate limbaje de programare, defalează proprietățile unui limbaj funcțional dinamic.
Limbi care acceptă programarea funcțională
D
A fost proiectat după C ++, obținând toate beneficiile sale, eliminând în același timp punctele slabe observate de a fi compatibil cu C.
Erlang
Este extrem de scalabil și concomitent, ceea ce îl face ideal pentru telecomunicații și alte aplicații care primesc cantități masive de date într-o ordine imprevizibilă.
Haskell
Acesta este un limbaj de programare funcțional pur, care folosește calcul Lambda.
ML
Este utilizat în aplicații matematice, științifice, financiare, analitice și alte aplicații. Unul dintre punctele sale forte este de a face software pentru a gestiona alte programe.
Obiectiv Caml
Este un limbaj open source care se bazează pe Caml. Tinde să creeze programe foarte ușoare, ajutându-i să se încarce și să ruleze mai repede decât cele create de alte limbi.
Sistem
Se bazează pe sintaxa LISP și structura ALGOL. Datorită simplității sale, este utilizat în multe cursuri de informatică ca o introducere în proiectarea programelor pentru a arăta unele dintre elementele fundamentale ale programării computerului.
Referințe
- Cine găzduiește asta (2019). Aflați programarea funcțională: acest stil de codare vă va arunca mintea. Luat de la: whoishostingthis.com.
- Andrea Bertoli (2019). O introducere adecvată a programării funcționale. Luat de la: dev.to.
- Hacker Earth (2020). Programare funcțională. Luat de la: hackerearth.com.
- Clojure (2020). Programare funcțională. Preluat de la: clojure.org.
- Akhil Bhadwal (2020). Programare funcțională: concepte, avantaje, dezavantaje și aplicații. Hack. Luat de la: hackr.io.
- Guru99 (2020). Ce este programarea funcțională? Tutorial cu exemplu. Luat de la: guru99.com.