Funktionsprogrammeringssprog
kaldes også funktionelle programmeringssprog. Eksempler er Haskell, LISP, Miranda, ML og Scheme.
Funktionsprogrammeringssprog tilhører gruppen af deklarative sprog og står i modsætning til imperative programmeringssprog på den måde at de udmærker sig i forhold hertil ved ikke at benytte sig af tilskrivninger. Den ønskede beregning udtrykkes som et system af sammenhørende funktionsdefinitioner.
Det betyder, at når en variabel i funktionsprogrammering først er bundet til en værdi, bevares denne værdi, indtil der ikke længere er brug for den pågældende variabel. Det fjerner behovet for tilstande, som giver mulighed for fejl via sideeffekter. Ifølge fortalere for funktionsprogrammering skulle blandt andet denne egenskab gøre programmer lettere at konstruere, overskue og vedligeholde.
Fakultetsfunktionen fak defineret ved n! = 1 * 2 * 3 * ... * n ville i Haskell og Miranda kunne skrives
fak 0 = 1
fak (n+1) = fak n * (n+1)
I ML ville man skrive
fun fak n = if n = 0 then 1 else fak (n-1) * n
og i LISP, med sin noget snurrige syntaks, der systematisk placerer
hver operator inde i en parentes foran sine operander,
ville det være
(LABEL FAK (LAMBDA (N) (COND ((ZEROP N) 1)
(T (TIMES (FAK (SUB1 N)) N))
)
)
)
Funktionen defineres rekursivt, og resultatet beregnes i et udtryk,
der returnerer en værdi.
Funktionsprogrammeringssprog tilhører klassen af deklarative sprog og har lambda-kalkule som teoretisk fundament.
Ved evaluering af
funktionsudtryk (argumentudtryk)
gør det en afgørende forskel, om værdien af argumentudtrykket altid
beregnes forud for overføring til funktionens formelle parameter
(værdioverføring, call by value), eller om argumentudtrykket overføres
til funktionen på uevalueret form (formoverføring, call by name)
for først at blive evalueret, når (om overhovedet) det benyttes i funktionen.
Funktionsprogrammeringssprog falder i to underklasser, afhængigt af
hvilken parameteroverføringsmekanisme de benytter. Man skelner mellem
ivrige (eager, strict) funktionsprogrammeringssprog, som bruger
værdioverføring (eksempelvis LISP, ML og Scheme), og dovne
(lazy, lenient, non-strict) sprog, hvor funktionskald benytter
formoverføring (eksempelvis Haskell og Miranda).
Programmer udtrykt i funktionsprogrammeringssprog er elegante og kompakte, men realiseringer af sprogene har ofte været langsomme og pladskrævende.

