Vad är funktionell programmering?

Funktionell programmering är ett programmeringsparadigm där basen för beräkning är utvärderingen av uttryck. Vissa egenskaper är användningen av högre ordningsfunktioner, referenstransparens och lat utvärdering. Fördelarna med programmeringsstilen är bland annat att programmen är lätta att läsa, är mycket pålitliga och kan delas upp i komponenter. Nackdelarna är att beräkningarna kan vara långsamma och stilen och syntaxen skiljer sig helt från andra vanliga programmeringsstilar. Den funktionella programmeringsstilen omfamnas oftare av akademiker än av proffs inom datavetenskap.

Som namnet antyder är funktioner en grundläggande del av detta programmeringsparadigm. Funktioner kan vara kapslade i andra funktioner, kallade högre ordningsfunktioner, och varje högre ordningsfunktion kan delas upp i byggblocksfunktioner som är lätta att förstå och felsöka. Exempel på några högre ordningsfunktioner är Map och Nest. Funktionen Map tar en funktion F och listan med variabler, till exempel (x, y, z) och ger resultatet i en lista: Map [F, (x, y, z)] = (F(x), F (y), F(z)). Nest tar funktionen F, variabeln x och antalet iterationer: Nest[ F, x, 3] = F(F(F(x))).

Ren funktionell programmering tar en ingång och returnerar en utgång utan att någonsin ändra en variabels tillstånd. Med andra ord, en funktion med samma ingång kommer alltid att ge samma resultat oavsett vad som har hänt tidigare i programmet. Detta kallas referenstransparens. Eftersom matematiska funktioner är referenstransparenta är funktionell programmering intuitiv för många matematiker, ingenjörer och vetenskapsmän.

Funktionernas referenstransparens gör att ordningen på funktionsutvärderingen inte är viktig. Funktioner behöver därför inte utvärderas förrän deras resultat behövs, vilket kallas lat utvärdering. Detta står i fullständig kontrast till imperativ programmering, där ett program börjar med det första kommandot och går igenom listan till det sista kommandot. Lata utvärdering hoppar över delar av programmet som inte följer logiskt eller är överflödiga, vilket automatiskt optimerar programmet och kan minska beräkningstiden.

Funktionell programmering har många fördelar jämfört med andra programmeringsparadigm. Funktioner med tydliga in- och utgångar är lätta att läsa och förstå. När en funktion väl har felsökts kan den användas tillförlitligt i andra applikationer. Flerkärniga maskiner kanske kan beräkna funktioner som utvärderas oberoende parallellt, vilket drastiskt förbättrar programmens prestanda.

Tyvärr lämpar sig inte alla program för parallell beräkning, och funktionella datorprogram kan vara ganska långsamma. Funktionella program är mycket beroende av rekursion, vilket ofta är mindre effektivt än att använda traditionella loopar eller iterationsmetoder. Faktum är att funktionell programmering kan vara ganska klumpig och svår att lära sig eftersom den inte liknar andra vanligare paradigm som objektorienterad programmering.
Akademiker tenderar att gynna funktionell programmering eftersom det ger ett tydligt och begripligt sätt att programmera komplexa verkliga problem. Några rena språk är Haskell och Erlang. Mathematica är specialiserad på symbolisk matematik, R är specialiserad på statistik och J är specialiserad på finansiell analys. Multiparadigmspråk som Scala och F# stöder både funktionell programmering och andra programmeringsstilar.