Funkcionalno programiranje je programska paradigma u kojoj je temelj izračunavanja evaluacija izraza. Neke karakteristike su korištenje funkcija višeg reda, referentna transparentnost i lijena evaluacija. Prednosti stila programiranja uključuju to što su programi laki za čitanje, vrlo su pouzdani i mogu se razbiti na komponente. Nedostaci su što izračuni mogu biti spori, a stil i sintaksa potpuno se razlikuju od ostalih uobičajenih stilova programiranja. Funkcionalni stil programiranja češće prihvaćaju akademici nego profesionalci iz računalnih znanosti.
Kao što ime govori, funkcije su temeljni dio ove programske paradigme. Funkcije mogu biti ugniježđene unutar drugih funkcija, koje se nazivaju funkcije višeg reda, a svaka funkcija višeg reda može se raščlaniti na funkcije građevnog bloka koje je lako razumjeti i otkloniti greške. Primjeri nekih funkcija višeg reda su Karta i Nest. Funkcija Map uzima funkciju F i popis varijabli, na primjer (x, y, z) i daje rezultat u popisu: Karta [F, (x, y, z)] = (F(x), F (y), F(z)). Nest uzima funkciju F, varijablu x i broj iteracija: Nest[ F, x, 3] = F(F(F(x))).
Čisto funkcionalno programiranje uzima ulaz i vraća izlaz bez promjene stanja varijable. Drugim riječima, funkcija s istim ulazom uvijek će dati iste rezultate bez obzira na ono što se prethodno dogodilo u programu. To se zove referentna transparentnost. Budući da su matematičke funkcije referentno transparentne, funkcionalno programiranje intuitivno je mnogim matematičarima, inženjerima i znanstvenicima.
Referentna transparentnost funkcija znači da redoslijed evaluacije funkcije nije važan. Stoga se funkcije ne moraju vrednovati dok se ne zatraže njihovi rezultati, što se naziva lijeno vrednovanje. Ovo je u potpunoj suprotnosti s imperativnim programiranjem, gdje program počinje s prvom naredbom i prolazi kroz popis do posljednje naredbe. Lijeno ocjenjivanje preskače dijelove programa koji ne slijede logički ili su suvišni, što automatski optimizira program i može smanjiti vrijeme računanja.
Funkcionalno programiranje ima mnoge prednosti u odnosu na druge programske paradigme. Funkcije s jasnim ulazima i izlazima lako se čitaju i razumiju. Nakon što je funkcija temeljito otklonjena, može se pouzdano koristiti u drugim aplikacijama. Višejezgreni strojevi mogu biti sposobni izračunati funkcije koje se neovisno evaluiraju paralelno, drastično poboljšavajući performanse programa.
Nažalost, nisu svi programi pogodni za paralelno računanje, a računalni funkcionalni programi mogu biti prilično spori. Funkcionalni programi uvelike se oslanjaju na rekurziju, koja je često manje učinkovita od tradicionalnih petlji ili metoda ponavljanja. Zapravo, funkcionalno programiranje može biti prilično nespretno i teško za naučiti jer ne nalikuje drugim uobičajenim paradigmama kao što je objektno orijentirano programiranje.
Znanstvenici imaju tendenciju da favoriziraju funkcionalno programiranje jer ono pruža jasan i razumljiv način programiranja složenih problema u stvarnom svijetu. Neki čisti jezici su Haskell i Erlang. Mathematica je specijalizirana za simboličku matematiku, R je specijalizirana za statistiku, a J je specijalizirana za financijsku analizu. Multiparadigmski jezici kao što su Scala i F# podržavaju i funkcionalno programiranje i druge stilove programiranja.