Hva er funksjonell programmering?
Funksjonell programmering er et programmeringsparadigme der beregningsgrunnlaget er evaluering av uttrykk. Noen kjennetegn er bruken av funksjoner med høyere orden, referans transparens og lat evaluering. Fordelene med programmeringsstilen inkluderer at programmer er enkle å lese, er veldig pålitelige og kan deles inn i komponenter. Ulempene er at beregningene kan være treg og stilen og syntaks er helt forskjellig fra andre vanlige programmeringsstiler. Den funksjonelle programmeringsstilen omfavnes oftere av akademikere enn av fagfolk innen informatikk.
Som navnet antyder er funksjoner en grunnleggende del av dette programmeringsparadigmet. Funksjoner kan hekles inn i andre funksjoner, kalt funksjoner for høyere ordre, og hver funksjon av høyere orden kan deles inn i byggesteinfunksjoner som er enkle å forstå og feilsøke. Eksempler på noen funksjoner med høyere ordre er Map and Nest. Funksjonen Kart tar en funksjon F og listen over variabler, for eksempel (x, y, z) og gir resultatet i en liste: Kart [F, (x, y, z)] = (F (x), F (y), F (z)). Nest tar funksjonen F, variabelen x, og antall iterasjoner: Nest [F, x, 3] = F (F (F (x))).
Ren funksjonell programmering tar en inngang og returnerer en utgang uten noen gang å endre en variabels tilstand. Med andre ord, en funksjon med samme inngang vil alltid gi de samme resultatene uavhengig av hva som har skjedd tidligere i programmet. Dette kalles referensiell gjennomsiktighet. Siden matematiske funksjoner er referensielt gjennomsiktige, er funksjonell programmering intuitiv for mange matematikere, ingeniører og forskere.
Referansetransparensen til funksjoner gjør at rekkefølgen av funksjonsevaluering ikke er viktig. Derfor trenger ikke funksjoner evalueres før resultatene er nødvendige, som kalles lat evaluering. Dette er i full kontrast med nødvendig programmering, der et program begynner med den første kommandoen og kjører gjennom listen til den siste kommandoen. Lat evaluering hopper over deler av programmet som ikke følger logisk eller er overflødige, noe som automatisk optimaliserer programmet og kan redusere datatiden.
Funksjonell programmering har mange fordeler i forhold til andre programmeringsparadigmer. Funksjoner med tydelige innganger og utganger er enkle å lese og forstå. Når en funksjon er feilsøkt grundig, kan den brukes pålitelig i andre applikasjoner. Multicore-maskiner kan være i stand til å beregne funksjoner som evalueres uavhengig parallelt, og drastisk forbedre ytelsen til programmer.
Dessverre låner ikke alle programmer seg til parallell databehandling, og databehandlingsfunksjonelle programmer kan være ganske trege. Funksjonelle programmer er avhengige av rekursjon, som ofte er mindre effektiv enn å bruke tradisjonelle løkker eller iterasjonsmetoder. Faktisk kan funksjonell programmering være ganske klønete og vanskelig å lære, siden det ikke ligner andre mer vanlige paradigmer som objektorientert programmering.
Akademikere har en tendens til å favorisere funksjonell programmering siden det gir en tydelig og forståelig måte å programmere komplekse problemer i den virkelige verden. Noen rene språk er Haskell og Erlang. Mathematica er spesialisert i symbolsk matematikk, R er spesialisert på statistikk og J er spesialisert i økonomisk analyse. Multiparadigm-språk som Scala og F # støtter både funksjonell programmering og andre programmeringsstiler.