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.

Forfattere: 
Nils Andersen
Casper Thomsen
Tania Andersen