Kas yra funkcinis programavimas?

Funkcinis programavimas yra programavimo paradigma, kurioje skaičiavimo pagrindas yra išraiškų įvertinimas. Kai kurios savybės yra aukštesnės eilės funkcijų naudojimas, nuorodų skaidrumas ir tingus vertinimas. Programavimo stiliaus pranašumai yra tai, kad programas lengva skaityti, jos yra labai patikimos ir gali būti skaidomos į komponentus. Trūkumai yra tai, kad skaičiavimai gali būti lėti, o stilius ir sintaksė visiškai skiriasi nuo kitų įprastų programavimo stilių. Funkcinį programavimo stilių dažniau laikosi akademikai nei informatikos specialistai.

Kaip rodo pavadinimas, funkcijos yra pagrindinė šios programavimo paradigmos dalis. Funkcijos gali būti įdėtos į kitas funkcijas, vadinamas aukštesnės eilės funkcijomis, o kiekviena aukštesnės eilės funkcija gali būti suskirstyta į kūrimo blokų funkcijas, kurias lengva suprasti ir derinti. Kai kurių aukštesnės eilės funkcijų pavyzdžiai yra Žemėlapis ir Nest. Funkcija Map paima funkciją F ir kintamųjų sąrašą, pavyzdžiui (x, y, z) ir pateikia rezultatą sąraše: Žemėlapis [F, (x, y, z)] = (F(x), F (y), F(z)). Nest naudoja funkciją F, kintamąjį x ir iteracijų skaičių: Nest[ F, x, 3] = F(F(F(x))).

Grynas funkcinis programavimas priima įvestį ir grąžina išvestį, nekeičiant kintamojo būsenos. Kitaip tariant, funkcija su ta pačia įvestimi visada duos tuos pačius rezultatus, neatsižvelgiant į tai, kas įvyko anksčiau programoje. Tai vadinama referenciniu skaidrumu. Kadangi matematinės funkcijos yra orientaciniu požiūriu skaidrios, funkcinis programavimas yra intuityvus daugeliui matematikų, inžinierių ir mokslininkų.

Referencinis funkcijų skaidrumas reiškia, kad funkcijų vertinimo tvarka nėra svarbi. Todėl funkcijų nereikia vertinti tol, kol nereikia jų rezultatų, o tai vadinama tinginiu vertinimu. Tai visiškai prieštarauja privalomam programavimui, kai programa prasideda pirmąja komanda ir eina per sąrašą iki paskutinės komandos. Atsainus vertinimas praleidžia logiškai nesilaikančias arba nereikalingas programos dalis, o tai automatiškai optimizuoja programą ir gali sutrumpinti skaičiavimo laiką.

Funkcinis programavimas turi daug pranašumų prieš kitas programavimo paradigmas. Aiškių įvesties ir išvesties funkcijas lengva perskaityti ir suprasti. Kai funkcija kruopščiai derinama, ją galima patikimai naudoti kitose programose. Daugiagysliai įrenginiai gali lygiagrečiai apskaičiuoti funkcijas, kurios vertinamos nepriklausomai, o tai drastiškai pagerina programų našumą.

Deja, ne visos programos tinka lygiagrečiam skaičiavimui, o funkcinės programos gali būti gana lėtos. Funkcinės programos labai priklauso nuo rekursijos, kuri dažnai yra mažiau efektyvi nei naudojant tradicines kilpas ar iteracijos metodus. Tiesą sakant, funkcinis programavimas gali būti gana gremėzdiškas ir sunkiai išmokstamas, nes jis nepanašus į kitas labiau paplitusias paradigmas, tokias kaip objektinis programavimas.
Akademikai linkę pirmenybę teikti funkciniam programavimui, nes jis suteikia aiškų ir suprantamą būdą programuoti sudėtingas realaus pasaulio problemas. Kai kurios grynos kalbos yra Haskell ir Erlang. „Mathematica“ specializuojasi simbolinėje matematikoje, R – statistikoje, o J – finansų analizėje. Daugiaparadigmų kalbos, tokios kaip Scala ir F#, palaiko ir funkcinį programavimą, ir kitus programavimo stilius.