Programowanie funkcjonalne to paradygmat programowania, w którym podstawą obliczeń jest ocena wyrażeń. Niektóre cechy to użycie funkcji wyższego rzędu, przejrzystość referencyjna i leniwa ocena. Zaletą stylu programowania jest to, że programy są łatwe do odczytania, są bardzo niezawodne i można je podzielić na komponenty. Wadą jest to, że obliczenia mogą być powolne, a styl i składnia całkowicie różnią się od innych popularnych stylów programowania. Funkcjonalny styl programowania jest częściej akceptowany przez naukowców niż przez informatyków.
Jak sama nazwa wskazuje, funkcje są fundamentalną częścią tego paradygmatu programowania. Funkcje mogą być zagnieżdżone w innych funkcjach, zwanych funkcjami wyższego rzędu, a każda funkcja wyższego rzędu może zostać podzielona na funkcje bloków konstrukcyjnych, które są łatwe do zrozumienia i debugowania. Przykładami niektórych funkcji wyższego rzędu są Map i Nest. Funkcja Map pobiera funkcję F i listę zmiennych, na przykład (x, y, z) i daje wynik w postaci listy: Map [F, (x, y, z)] = (F(x), F (y), F(z)). Nest przyjmuje funkcję F, zmienną x i liczbę iteracji: Nest[ F, x, 3] = F(F(F(x))).
Czyste programowanie funkcyjne pobiera dane wejściowe i zwraca dane wyjściowe bez zmiany stanu zmiennej. Innymi słowy, funkcja z tymi samymi danymi wejściowymi zawsze da te same wyniki, niezależnie od tego, co działo się wcześniej w programie. Nazywa się to przejrzystością referencyjną. Ponieważ funkcje matematyczne są referencyjnie przejrzyste, programowanie funkcjonalne jest intuicyjne dla wielu matematyków, inżynierów i naukowców.
Przejrzystość referencyjna funkcji powoduje, że kolejność oceny funkcji nie jest istotna. Dlatego funkcje nie muszą być oceniane, dopóki nie są potrzebne ich wyniki, co nazywa się leniwą oceną. Stanowi to całkowity kontrast z programowaniem imperatywnym, w którym program zaczyna się od pierwszego polecenia i przechodzi przez listę aż do ostatniego polecenia. Ocena z opóźnieniem pomija części programu, które nie są logiczne lub są zbędne, co automatycznie optymalizuje program i może skrócić czas obliczeń.
Programowanie funkcjonalne ma wiele zalet w porównaniu z innymi paradygmatami programowania. Funkcje z wyraźnymi wejściami i wyjściami są łatwe do odczytania i zrozumienia. Po dokładnym debugowaniu funkcji można ją niezawodnie wykorzystywać w innych aplikacjach. Maszyny wielordzeniowe mogą być w stanie obliczać funkcje, które są oceniane niezależnie równolegle, co radykalnie poprawia wydajność programów.
Niestety, nie wszystkie programy nadają się do przetwarzania równoległego, a obliczanie programów funkcjonalnych może być raczej powolne. Programy funkcjonalne w dużej mierze opierają się na rekursji, która często jest mniej wydajna niż przy użyciu tradycyjnych pętli lub metod iteracyjnych. W rzeczywistości programowanie funkcjonalne może być dość niezdarne i trudne do nauczenia, ponieważ nie przypomina innych bardziej powszechnych paradygmatów, takich jak programowanie obiektowe.
Nauczyciele akademiccy preferują programowanie funkcjonalne, ponieważ zapewnia jasny i zrozumiały sposób programowania złożonych problemów w świecie rzeczywistym. Niektóre czyste języki to Haskell i Erlang. Mathematica specjalizuje się w matematyce symbolicznej, R w statystyce, a J w analizie finansowej. Języki wieloparadygmatyczne, takie jak Scala i F#, obsługują zarówno programowanie funkcjonalne, jak i inne style programowania.