Wat is functioneel programmeren?
Functioneel programmeren is een programmeerparadigma waarbij de basis van de berekening de evaluatie van uitdrukkingen is. Sommige kenmerken zijn het gebruik van functies van een hogere orde, referentiële transparantie en luie evaluatie. De voordelen van de programmeerstijl zijn dat programma's gemakkelijk te lezen zijn, zeer betrouwbaar zijn en in componenten kunnen worden onderverdeeld. Nadelen zijn dat berekeningen traag kunnen zijn en de stijl en syntaxis volledig verschillen van andere gangbare programmeerstijlen. De functionele programmeerstijl wordt vaker omarmd door academici dan door professionals in de informatica.
Zoals de naam al doet vermoeden, zijn functies een fundamenteel onderdeel van dit programmeerparadigma. Functies kunnen worden genest in andere functies, hogere-orde functies genoemd, en elke hogere-orde functie kan worden onderverdeeld in bouwsteenfuncties die gemakkelijk te begrijpen en te debuggen zijn. Voorbeelden van enkele functies van een hogere orde zijn Map en Nest. De functie Map neemt een functie F en de lijst met variabelen, bijvoorbeeld (x, y, z) en geeft het resultaat in een lijst: Map [F, (x, y, z)] = (F (x), F (y), F (z)). Nest neemt de functie F, de variabele x en het aantal iteraties: Nest [F, x, 3] = F (F (F (x))).
Pure functionele programmering neemt een input en retourneert een output zonder ooit de status van een variabele te veranderen. Met andere woorden, een functie met dezelfde invoer geeft altijd dezelfde resultaten, ongeacht wat er eerder in het programma is gebeurd. Dit wordt referentiële transparantie genoemd. Omdat wiskundige functies referentieel transparant zijn, is functioneel programmeren intuïtief voor veel wiskundigen, ingenieurs en wetenschappers.
De referentiële transparantie van functies betekent dat de volgorde van functie-evaluatie niet belangrijk is. Daarom hoeven functies niet te worden geëvalueerd voordat hun resultaten nodig zijn, wat luie evaluatie wordt genoemd. Dit staat in schril contrast met imperatief programmeren, waarbij een programma begint met het eerste commando en door de lijst loopt tot het laatste commando. Luie evaluatie slaat delen van het programma over die niet logisch volgen of overbodig zijn, wat het programma automatisch optimaliseert en de computertijd kan verkorten.
Functioneel programmeren heeft veel voordelen ten opzichte van andere programmeerparadigma's. Functies met duidelijke in- en uitgangen zijn gemakkelijk te lezen en te begrijpen. Zodra een functie grondig is verwijderd, kan deze betrouwbaar worden gebruikt in andere toepassingen. Multicore-machines kunnen mogelijk functies berekenen die onafhankelijk parallel worden geëvalueerd, waardoor de prestaties van programma's drastisch worden verbeterd.
Helaas lenen niet alle programma's zich voor parallel computergebruik en kunnen functionele computerprogramma's vrij langzaam zijn. Functionele programma's zijn sterk afhankelijk van recursie, die vaak minder efficiënt is dan traditionele lussen of iteratiemethoden. Functioneel programmeren kan zelfs behoorlijk onhandig en moeilijk te leren zijn, omdat het niet lijkt op andere, meer gangbare paradigma's zoals objectgeoriënteerd programmeren.
Academici geven de voorkeur aan functioneel programmeren, omdat het een duidelijke en begrijpelijke manier biedt om complexe problemen uit de echte wereld te programmeren. Sommige pure talen zijn Haskell en Erlang. Mathematica is gespecialiseerd in symbolische wiskunde, R is gespecialiseerd in statistiek en J is gespecialiseerd in financiële analyse. Multiparadigm-talen zoals Scala en F # ondersteunen zowel functioneel programmeren als andere programmeerstijlen.