Ce este programarea funcțională?

Programarea funcțională este o paradigmă de programare în care baza de calcul este evaluarea expresiilor. Unele caracteristici sunt utilizarea funcțiilor de ordin superior, transparența referențială și evaluarea leneșă. Avantajele stilului de programare includ faptul că programele sunt ușor de citit, sunt foarte fiabile și pot fi împărțite în componente. Dezavantajele sunt că calculele pot fi lente, iar stilul și sintaxa sunt complet diferite de alte stiluri obișnuite de programare. Stilul de programare funcțională este mai des acceptat de cadre universitare decât de profesioniștii în domeniul informaticii.

După cum sugerează și numele, funcțiile sunt o parte fundamentală a acestei paradigme de programare. Funcțiile pot fi imbricate în alte funcții, numite funcții de ordin superior, iar fiecare funcție de ordin superior poate fi împărțită în funcții de bloc care sunt ușor de înțeles și de depanat. Exemple de funcții de ordin superior sunt Harta și Cuib. Funcția Hartă preia o funcție F și lista de variabile, de exemplu (x, y, z) și dă rezultatul într-o listă: Hartă [F, (x, y, z)] = (F(x), F (y), F(z)). Nest ia funcția F, variabila x și numărul de iterații: Nest[ F, x, 3] = F(F(F(x))).

Programarea pură funcțională preia o intrare și returnează o ieșire fără a schimba vreodată starea unei variabile. Cu alte cuvinte, o funcție cu aceeași intrare va da întotdeauna aceleași rezultate, indiferent de ceea ce s-a întâmplat anterior în program. Aceasta se numește transparență referențială. Deoarece funcțiile matematice sunt transparente din punct de vedere referențial, programarea funcțională este intuitivă pentru mulți matematicieni, ingineri și oameni de știință.

Transparența referențială a funcțiilor înseamnă că ordinea evaluării funcțiilor nu este importantă. Prin urmare, funcțiile nu trebuie evaluate până când sunt necesare rezultatele lor, ceea ce se numește evaluare leneșă. Acest lucru este în total contrast cu programarea imperativă, în care un program începe cu prima comandă și rulează prin listă până la ultima comandă. Evaluarea leneșă trece peste părți ale programului care nu urmează logic sau sunt de prisos, ceea ce optimizează automat programul și poate reduce timpul de calcul.

Programarea funcțională are multe avantaje față de alte paradigme de programare. Funcțiile cu intrări și ieșiri clare sunt ușor de citit și de înțeles. Odată ce o funcție este complet depanată, poate fi utilizată în mod fiabil în alte aplicații. Mașinile multicore pot fi capabile să calculeze funcții care sunt evaluate independent în paralel, îmbunătățind drastic performanța programelor.

Din păcate, nu toate programele se pretează la calcul paralel, iar programele funcționale de calcul pot fi destul de lente. Programele funcționale se bazează în mare măsură pe recursivitate, care este adesea mai puțin eficientă decât folosind bucle tradiționale sau metode de iterație. De fapt, programarea funcțională poate fi destul de neîndemânatică și dificil de învățat, deoarece nu seamănă cu alte paradigme mai comune, cum ar fi programarea orientată pe obiecte.
Academicienii tind să favorizeze programarea funcțională, deoarece oferă o modalitate clară și ușor de înțeles de a programa probleme complexe din lumea reală. Unele limbi pure sunt Haskell și Erlang. Mathematica este specializată în matematică simbolică, R este specializată în statistică și J este specializată în analiză financiară. Limbajele multiparadigme, cum ar fi Scala și F#, acceptă atât programarea funcțională, cât și alte stiluri de programare.