In deinformatica isfunctioneel programmeren eenprogrammeerstijl en eenprogrammeerparadigma. Hierbij wordt deinformatieverwerking in de vorm vanfuncties uitgedrukt, vergelijkbaar metwiskundigefuncties. Bij deze stijl dienen (liefst alle) wijzigingen vanvariabelen buiten de functie (de zogenaamde "neveneffecten") en het opslaan vanprogrammatoestand en wijzigbare variabelen vermeden te worden. Variabelen voor onder meer een accumulator, teller, globale of controlevariabele zijn uit den boze.
Voorbeelden van meer of minder zuivereprogrammeertalen voor functioneel programmeren zijnAPL,Erlang,F#,Haskell,Lisp,ML,Scala enScheme, waarvan Haskell de puurste is.
De twee belangrijkste mechanismen binnen delambdacalculus om tot een berekening te komen zijn de abstractie en deapplicatie.
Voor het programmeren komt abstractie neer op het definiëren van een functie: "bij iedere term A met de eigenschappen die bij A horen, hoort een antwoord B die op deze-en-deze manier afhangt van wat A precies is". Bijvoorbeeld de functie


Deze functie
definieert een verbinding tussen twee waarden uit de verzameling
. Deze verbinding kan toegepast worden op ieder element van
en levert dan ook weer een ander, bijbehorend element van
op. Hoe dat gebeurt en wat eencomputer (of mens) ervoor moet doen om dat bijbehorende element te vinden doet er niet toe, het gaat erom dat de verbinding bestaat en toegepast kan worden.
Naast abstractie is er ook de applicatie. Voor programmeerdoeleinden komt dit neer op het toepassen van een functie op een argument. Bijvoorbeeld:

Toepassing van een functie op een specifiek argument dat voldoet aan de algemene beschrijving van argumenten voor die functie, levert een antwoord op. Hoe en waarom doet er weer niet toe, het gaat er alleen om dat het antwoord geproduceerd wordt.
Veel functies in functionele programmeertalen zijnreferentieel transparant. Dit houdt in dat eenexpressie vervangen kan worden door zijn waarde zonder de werking van het programma te veranderen. Een voorbeeld hiervan zijnrekenkundige bewerkingen, zoals1 + 1; dit kan vervangen worden door2 zonder het programma te veranderen. Veel wiskundige functies zijn ook referentieel transparant, zoalssin(x) (deze levert voor een gegevenx altijd dezelfde waarde op).
Een belangrijk kenmerk van een functionele taal is dat een functie ook een andere functie als argument kan meekrijgen. Dit wordenhogere-ordefuncties genoemd. Zo bestaat inHaskell en andere functionele talen de functiemap. De functiemap past een andere functie F op alle elementen uit een lijst L. De argumenten van functiemap zijn dus de functie F en de lijst L.
Een dergelijk hoog-niveau model van berekening is natuurlijk mooi en vooral eenvoudig, maar het is niet direct toe te passen op dehardware zoals die voorkomt in modernecomputers. Functionele talen leunen dan ook sterk op geavanceerde en vooral complexecompilers eninterpreters die de vertaalslag maken van functietoepassing naar het stap-voor-stapmodel van deprocessor.
Deze vertaalslag is veel groter dan bij deimperatieve talen, wat zijn weerslag heeft gevonden in de (vaak beperkte) snelheid waarmee veel functionele programma's uitgevoerd werden (zeker in de eerste generaties van ontwikkelomgevingen voor deze talen was dit een aanzienlijk probleem). Dit heeft zijn weerslag gehad in de populariteit van functionele talen buiten de onderzoeksomgevingen vanuniversiteiten.
Tegenwoordig neemt de populariteit van functionele talen sterk toe. Zij zijn namelijk door de afwezigheid vanneveneffecten veel beter dan imperatieve talen in staat om berekeningengeparallelliseerd uit te voeren. De berekening wordt dan uitgevoerd door meerdereprocessoren van één computer tegelijkertijd of zelfs door meerdere computers tegelijkertijd. Vanaf ongeveer 2005 zijn computers met meerdere processoren sterk in prijs gedaald en is de belangstelling voor functioneel programmeren toegenomen.
Het grootst merkbare onderscheid is ongetwijfeld tussen de functionele programmeertalen en deimperatieve talen. Maken functionele talen gebruik van het hoog-niveau model van delambdacalculus, de imperatieve talen zijn geheel geënt op het berekeningsmodel van de onderliggende processor: stap voor kleine stap, iedere stap letterlijk in het imperatieve programma opgenomen als een individuele opdracht. Is een functie in een functionele taal een programma op zich, in een imperatieve taal wordt iedere functie onderverdeeld in deze kleine, losse stappen. Ook een groot verschil is dat in de puur functionele talen geen sprake is van expliciete variabelendeclaratie of geheugenreservering. Dit zorgt voor transparante, compacte code. Het is mede daardoor ook makkelijk om over deze code te redeneren, en bijvoorbeeld correctheid te bewijzen. Sterker nog, omdat je precies weet wanneer er wat met een waarde gebeurt (iets wat in de imperatieve wereld zeer moeilijk bereikt kan worden door de mogelijkheid vanneveneffecten), kan je automatisch uitzoeken wanneer bepaalde functies parallel kunnen worden uitgevoerd.
Daarnaast onderscheiden de functionele talen zich van delogische talen. In deze taalcategorie draait het niet om functies en functie-toepassingen maar om bewijsobjecten enpredicatenlogica. De logische en functionele talen lijken echter veel op elkaar in het opzicht dat ze een hoog-niveau abstractie als model kiezen en staan daarin samen lijnrecht tegenover deimperatieve talen; om deze reden worden functionele enlogische talen samen ook wel dedeclaratieve paradigma genoemd.
Ten slotte is er veel onenigheid over de positie vanobjectgeoriënteerde programmeertalen in dit geheel; deze talen verdelen een berekening in verschillende onderdelen, waarbij ieder onderdeel de verantwoordelijkheid is van een opzichzelfstaand programma-object. Deze objecten op zich worden intern echter weer opgesteld aan de hand van één (of meer) van de bovengenoemde modellen, dus de vraag blijft of dit model als een geheel afzonderlijk model gezien kan worden.