Mis on funktsionaalne programmeerimine?

Funktsionaalne programmeerimine on programmeerimisparadigma, kus arvutamise aluseks on avaldiste hindamine. Mõned omadused on kõrgema järgu funktsioonide kasutamine, referentsiaalne läbipaistvus ja laisk hindamine. Programmeerimisstiili eeliste hulka kuulub see, et programme on lihtne lugeda, need on väga töökindlad ja osadeks jaotavad. Puuduseks on see, et arvutused võivad olla aeglased ning stiil ja süntaks on teistest levinud programmeerimisstiilidest täiesti erinevad. Funktsionaalne programmeerimisstiil on sagedamini omaks võetud akadeemikute kui arvutiteaduste spetsialistide seas.

Nagu nimigi ütleb, on funktsioonid selle programmeerimisparadigma oluline osa. Funktsioonid võivad olla paigutatud teistesse funktsioonidesse, mida nimetatakse kõrgema järgu funktsioonideks, ja iga kõrgema järgu funktsiooni saab jagada ehitusploki funktsioonideks, mida on lihtne mõista ja siluda. Mõned kõrgema järgu funktsioonid on näiteks Map ja Nest. Funktsioon Map võtab funktsiooni F ja muutujate loendi, näiteks (x, y, z) ning annab tulemuse loendis: Kaart [F, (x, y, z)] = (F(x), F (y), F(z)). Nest võtab funktsiooni F, muutuja x ja iteratsioonide arvu: Nest[ F, x, 3] = F(F(F(x))).

Puhas funktsionaalne programmeerimine võtab sisendi ja tagastab väljundi muutuja olekut muutmata. Teisisõnu, sama sisendiga funktsioon annab alati samad tulemused, olenemata sellest, mis programmis on varem toimunud. Seda nimetatakse referentsiaalseks läbipaistvuseks. Kuna matemaatilised funktsioonid on referentsiaalselt läbipaistvad, on funktsionaalne programmeerimine paljudele matemaatikutele, inseneridele ja teadlastele intuitiivne.

Funktsioonide referatiivne läbipaistvus tähendab, et funktsioonide hindamise järjekord ei ole oluline. Seetõttu ei pea funktsioone hindama enne, kui on vaja nende tulemusi, mida nimetatakse laisaks hindamiseks. See on täielik vastand kohustuslikule programmeerimisele, kus programm algab esimese käsuga ja jookseb läbi loendi kuni viimase käsuni. Laisk hindamine jätab vahele programmi osad, mis ei järgi loogiliselt või on üleliigsed, mis optimeerib programmi automaatselt ja võib vähendada arvutusaega.

Funktsionaalsel programmeerimisel on teiste programmeerimisparadigmade ees palju eeliseid. Selgete sisendite ja väljunditega funktsioone on lihtne lugeda ja mõista. Kui funktsioon on põhjalikult silutud, saab seda teistes rakendustes usaldusväärselt kasutada. Mitmetuumalised masinad võivad olla võimelised arvutama funktsioone, mida hinnatakse paralleelselt sõltumatult, mis parandab oluliselt programmide jõudlust.

Kahjuks ei sobi kõik programmid paralleelarvutuseks ja funktsionaalsete programmide arvutamine võib olla üsna aeglane. Funktsionaalsed programmid sõltuvad suuresti rekursioonist, mis on sageli vähem tõhus kui traditsiooniliste tsüklite või iteratsioonimeetodite kasutamine. Tegelikult võib funktsionaalne programmeerimine olla üsna kohmakas ja seda on raske õppida, kuna see ei sarnane muudele levinumate paradigmadega, nagu objektorienteeritud programmeerimine.
Akadeemikud eelistavad funktsionaalset programmeerimist, kuna see annab selge ja arusaadava viisi keeruliste reaalmaailma probleemide programmeerimiseks. Mõned puhtad keeled on Haskell ja Erlang. Mathematica on spetsialiseerunud sümboolsele matemaatikale, R on spetsialiseerunud statistikale ja J on spetsialiseerunud finantsanalüüsile. Multiparadigma keeled, nagu Scala ja F#, toetavad nii funktsionaalset programmeerimist kui ka muid programmeerimisstiile.