Introduksjon
Funksjonell programmering er et programmeringsparadigme der vi prøver å binde alt i ren matematisk funksjonsstil. Det er en deklarativ type programmeringsstil. Hovedfokuset er på hva man skal løse i motsetning til en imperativ stil der hovedfokuset er hvordan man løser. Den bruker uttrykk i stedet for utsagn. Et uttrykk blir evaluert for å produsere en verdi, mens en setning utføres for å tilordne variabler. Disse funksjonene har noen spesielle funksjoner som er omtalt nedenfor.
Funksjonell programmering er basert på lambdaregning:
Lambdakalkulus er et rammeverk utviklet av Alonzo Church for å studere beregninger med funksjoner. Det kan kalles det minste programmeringsspråket i verden. Det gir definisjonen av hva som er beregnet. Alt som kan beregnes med lambda-kalkulus kan beregnes. Den tilsvarer Turing-maskinen i sin evne til å beregne. Den gir et teoretisk rammeverk for å beskrive funksjoner og deres evaluering. Det danner grunnlaget for nesten alle gjeldende funksjonelle programmeringsspråk.
Fakta: Alan Turing var en student av Alonzo Church som skapte Turing-maskinen som la grunnlaget for imperativ programmeringsstil.
Programmeringsspråk som støtter funksjonell programmering: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.
Konsepter for funksjonell programmering:
- Rene funksjoner
- Rekursjon Referensiell gjennomsiktighetsfunksjoner er førsteklasses og kan være av høyere orden Variabler er uforanderlige
Rene funksjoner: Disse funksjonene har to hovedegenskaper. For det første produserer de alltid samme utgang for samme argumenter uavhengig av noe annet.
For det andre har de ingen bivirkninger, det vil si at de ikke endrer noen argumenter eller lokale/globale variabler eller input/output-strømmer.
Senere egenskap kalles uforanderlighet. Den rene funksjonens eneste resultat er verdien den returnerer. De er deterministiske.
Programmer gjort ved hjelp av funksjonell programmering er enkle å feilsøke fordi rene funksjoner ikke har noen bivirkninger eller skjult I/O. Rene funksjoner gjør det også enklere å skrive parallelle/samtidige applikasjoner. Når koden er skrevet i denne stilen, kan en smart kompilator gjøre mange ting - den kan parallellisere instruksjonene, vente med å evaluere resultatene når du trenger dem, og huske resultatene siden resultatene aldri endres så lenge inngangen ikke endres.
eksempel på den rene funksjonen:
sum(x, y) // sum is function taking x and y as arguments return x + y // sum is returning sum of x and y without changing them>
Rekursjon: Det er ingen for eller while-løkke i funksjonelle språk. Iterasjon i funksjonelle språk implementeres gjennom rekursjon. Rekursive funksjoner kaller seg selv gjentatte ganger, helt til de når basissaken.
eksempel på den rekursive funksjonen:
fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>
Referensiell åpenhet: I funksjonelle programmer endrer ikke variabler når de er definert verdien gjennom hele programmet. Funksjonelle programmer har ikke oppdragsoppgaver. Hvis vi må lagre en eller annen verdi, definerer vi nye variabler i stedet. Dette eliminerer enhver sjanse for bivirkninger fordi enhver variabel kan erstattes med dens faktiske verdi på et hvilket som helst tidspunkt for utførelse. Tilstanden til enhver variabel er konstant til enhver tid.
Eksempel:
x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>
Funksjonene er førsteklasses og kan være av høyere orden: Førsteklasses funksjoner behandles som førsteklasses variabel. De første klassevariablene kan sendes til funksjoner som parameter, kan returneres fra funksjoner eller lagres i datastrukturer. Funksjoner av høyere orden er funksjonene som tar andre funksjoner som argumenter, og de kan også returnere funksjoner.
Eksempel:
show_output(f) // function show_output is declared taking argument f // which are another function f(); // calling passed function print_gfg() // declaring another function print('hello gfg'); show_output(print_gfg) // passing function in another function> Variabler er uforanderlige: I funksjonell programmering kan vi ikke endre en variabel etter at den er initialisert. Vi kan lage nye variabler – men vi kan ikke endre eksisterende variabler, og dette hjelper virkelig å opprettholde tilstanden gjennom hele programmets kjøretid. Når vi oppretter en variabel og angir verdien, kan vi ha full tillit og vite at verdien til den variabelen aldri vil endre seg.
Fordeler og ulemper med funksjonell programmering
Fordeler:
- Rene funksjoner er lettere å forstå fordi de ikke endrer noen tilstander og bare avhenger av input som gis til dem. Uansett hva de produserer, er returverdien de gir. Funksjonssignaturen deres gir all informasjon om dem, dvs. returtypen og argumentene deres.
- Funksjonelle programmeringsspråks evne til å behandle funksjoner som verdier og overføre dem til funksjoner som parametere gjør koden mer lesbar og lett forståelig.
- Testing og feilsøking er enklere. Siden rene funksjoner bare tar argumenter og produserer utdata, produserer de ingen endringer, tar ikke inn input eller produserer noe skjult utdata. De bruker uforanderlige verdier, så det blir lettere å sjekke noen problemer i programmer skrevet bruker rene funksjoner.
- Den brukes til å implementere samtidighet/parallellisme fordi rene funksjoner ikke endrer variabler eller andre data utenfor den.
- Den tar i bruk lat evaluering som unngår gjentatt evaluering fordi verdien evalueres og lagres kun når den er nødvendig.
Ulemper:
- Noen ganger kan det å skrive rene funksjoner redusere lesbarheten til kode.
- Å skrive programmer i rekursiv stil i stedet for å bruke loops kan være litt skremmende.
- Det er enkelt å skrive rene funksjoner, men å kombinere dem med resten av applikasjonen og I/O-operasjoner er en vanskelig oppgave.
- Uforanderlige verdier og rekursjon kan føre til redusert ytelse.
Applikasjoner:
- Det brukes i matematiske beregninger.
- Det er nødvendig der samtidighet eller parallellitet er nødvendig.
Fakta: Whatsapp trenger bare 50 ingeniører for sine 900M brukere fordi Erlang brukes til å implementere samtidige behov. Facebook bruker Haskell i sitt antispamsystem.