[go: up one dir, main page]

Hopp til innhold

Funksjonell programmering

Fra Wikipedia, den frie encyklopedi

Funksjonell programmering brukes innenfor informatikken om et programmeringsparadigme som behandler utregninger som en evaluering av matematiske funksjoner og unngår tilstandsendringer og foranderlige data. Det er et deklarativt programmeringsparadigme, i motsetning til imperativt programmeringsparadigme, som betyr at programmering er gjort med uttrykk som deklarerer hva som skal utføres i motsetning til å beskrive hvordan.

I funksjonell programmering avhenger utverdien bare av argumentene som er innverdien til denne funksjonen. En funksjon f som kalles to ganger med argumentet x, vil produsere den samme verdien f(x) hver gang – samme data inn vil alltid gi samme produkt ut. Ved å eliminere sideeffekter, dvs. tilstandsendringer som ikke avhenger av funksjonens inndata, kan man gjøre det mye enklere å forstå og forutsi programmets adferd. Dette er en av hovedmotivasjonene bak utviklingen av funksjonell programmering.

Selv om noen av de matematiske prinsippene bak funksjoner har vært kjent siden 1930-tallet og funksjonell programmering har eksistert siden 1950-tallet, er det først etter årtusenskiftet at utbredelsen og populariteten har økt i bredere lag blant utviklere. En av årsakene er at CPU-er med flere kjerner i perioden ble utbredt datamaskiner og mobiltelefoner og at å spre en oppgave ut til flere kjerner som jobber i parallell vil kunne utføre noen oppgaver raskere og at det er mer håndterlig å gjøre dette feilfritt i funksjonelle språk. Språk som (Common) Lisp, Haskell, Erlang, Scala, F# (F-sharp), Clojure nevnes ofte som funksjonelle programmeringsspråk med varierende grad av renhet. I de fleste andre populære høynivåspråk støttes noen av prinsippene slik at kildekode også i disse kan skrives i en delvis funksjonell stil, som blant annet støtte for førsteklasses-, anonyme- og høyereordens funksjoner, enderekursjonsoptimalisering, støtte for å unngå uønskede sideeffekter, persistens i datastrukturer m.m.