A funkcionális programozás (angolul: functional programming) egy programozási módszertan, vagyis egyike a programozási paradigmáknak. Nevezhetjük applikatív programozásnak is. A funkcionális programnyelvek a programozási feladatot egy függvény kiértékelésének tekintik. A két fő eleme az érték és a függvény, nevét is függvények kitüntetett szerepének köszönheti.
Egy más megfogalmazás szerint, a funkcionális programozás során a programozó inkább azt specifikálja programban, mit kell kiszámítani, nem azt, hogy hogyan, milyen lépésekben. Függvények hívásából és kiértékelésből áll a program. Nincsenek állapotok, mellékhatások (nem számít, mikor, csak az, melyik függvényt hívjuk).[1]
A rekurzió a funkcionális programozás egyik fontos lehetősége, az ismétlések és ciklusok helyett rekurziót alkalmazhatjuk.
Alapjául a lambda-kalkulus (vagy λ-kalkulus) szolgál, a tisztán funkcionális nyelvek a matematikában megszokott függvényfogalmat valósítják meg. Az ilyen programozás során a megoldandó feladatnál az eredményhez vezető út nem is biztosan ismert, a program végrehajtásához csupán az eredmény pontos definíciója szükséges. Tisztán funkcionális programozás esetén tehát nincs állapot és nincs értékadás.
Egy egyszerű funkcionális program például az f f1 kifejezés, ahol az f egy függvényértéket eredményező kifejezés (röviden függvény), az f1 pedig egy tetszőleges kifejezés. Matematikailag ezt úgy is mondhatjuk, hogy az f {\displaystyle f} függvényt alkalmazzuk az f 1 {\displaystyle f1} argumentumra.
f f1
f
f1
Egy Haskell nyelven írt példa, a faktoriális függvény definíciója:
factorial 0 = 1 factorial n = n * factorial(n-1)
Ugyanez Erlang nyelven:
factorial(0) -> 1; factorial(N) -> N * factorial(N-1)
A faktoriális függvény egy lehetséges megadása Lisp nyelven:
(defun factorial (n) (if (<= n 1) 1 (* n (factorial (- n 1)))))
Végül egy lambda-absztrakciós megoldás Standard ML (SML) nyelven:
val rec factorial = fn 0 => 1 | n => n * factorial(n -1)
Az egyik korai funkcionális nyelv a Lisp, melyet John McCarthy alkotott meg az 1950-es évek végén.[2] A ma legelterjedtebb változatai az általános célú Common Lisp és Scheme nyelvek.
Az első típusos funkcionális nyelv az ML (Meta Language) egyik korai változata volt, amit Robin Milner készített az 1970-es évek közepén a Edinburgh-i Egyetemen, melyben megvalósította típuselméleti eredményeit. Ezt a nyelvet alapvetően logikai állítások és tételek bizonyítására tervezték.
A Hope és egyéb funkcionális nyelvek, köztük az ML és NPL által inspirálva dolgozták ki az SML, azaz Standard ML nyelvet az 1980-as évek közepétől. Több dialektusa is készült, mint például az OCaml.