Introduktion
Funktionel programmering er et programmeringsparadigme, hvor vi forsøger at binde alt i ren matematisk funktionsstil. Det er en deklarativ form for programmeringsstil. Dens hovedfokus er på, hvad der skal løses i modsætning til en imperativ stil, hvor hovedfokus er, hvordan man løser. Den bruger udtryk i stedet for udsagn. Et udtryk evalueres til at producere en værdi, mens en sætning udføres for at tildele variabler. Disse funktioner har nogle specielle funktioner, der diskuteres nedenfor.
Funktionel programmering er baseret på lambdaregning:
Lambdaregning er en ramme udviklet af Alonzo Church til at studere beregninger med funktioner. Det kan kaldes det mindste programmeringssprog i verden. Det giver definitionen af, hvad der kan beregnes. Alt, der kan beregnes ved lambda-regning, kan beregnes. Det svarer til Turing-maskine i sin evne til at beregne. Det giver en teoretisk ramme for beskrivelse af funktioner og deres evaluering. Det danner grundlaget for næsten alle nuværende funktionelle programmeringssprog.
Fakta: Alan Turing var en elev af Alonzo Church, der skabte Turing-maskine, som lagde grundlaget for en imperativ programmeringsstil.
Programmeringssprog, der understøtter funktionel programmering: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.
Begreber for funktionel programmering:
- Rene funktioner
- Rekursion Referencegennemsigtighedsfunktioner er førsteklasses og kan være af højere orden. Variabler er uforanderlige
Rene funktioner: Disse funktioner har to hovedegenskaber. For det første producerer de altid det samme output for de samme argumenter, uanset noget andet.
For det andet har de ingen bivirkninger, dvs. de ændrer ikke nogen argumenter eller lokale/globale variabler eller input/outputstrømme.
Senere egenskab kaldes uforanderlighed. Den rene funktions eneste resultat er den værdi, den returnerer. De er deterministiske.
Programmer udført ved hjælp af funktionel programmering er nemme at fejlfinde, fordi rene funktioner ikke har nogen bivirkninger eller skjult I/O. Rene funktioner gør det også nemmere at skrive parallelle/samtidige applikationer. Når koden er skrevet i denne stil, kan en smart compiler gøre mange ting - den kan parallelisere instruktionerne, vente med at evaluere resultaterne, når de har brug for dem, og huske resultaterne, da resultaterne aldrig ændres, så længe inputtet ikke ændres.
eksempel på den rene funktion:
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>
Rekursion: Der er ingen for eller while-løkke i funktionelle sprog. Iteration i funktionelle sprog implementeres gennem rekursion. Rekursive funktioner kalder sig gentagne gange, indtil de når basissagen.
eksempel på den rekursive funktion:
fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>
Referencegennemsigtighed: I funktionelle programmer ændrer variabler, når de først er defineret, ikke deres værdi gennem hele programmet. Funktionelle programmer har ikke opgavebeskrivelser. Hvis vi skal gemme en eller anden værdi, definerer vi nye variable i stedet. Dette eliminerer enhver chance for bivirkninger, fordi enhver variabel kan erstattes med dens faktiske værdi på et hvilket som helst tidspunkt af udførelse. Tilstanden for enhver variabel er konstant på ethvert tidspunkt.
Eksempel:
x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>
Funktionerne er førsteklasses og kan være af højere orden: Førsteklasses funktioner behandles som førsteklasses variable. De første klassevariabler kan overføres til funktioner som parameter, kan returneres fra funktioner eller lagres i datastrukturer. Funktioner af højere orden er de funktioner, der tager andre funktioner som argumenter, og de kan også returnere funktioner.
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 funktionel programmering kan vi ikke ændre en variabel, efter at den er blevet initialiseret. Vi kan oprette nye variabler - men vi kan ikke ændre eksisterende variabler, og dette hjælper virkelig med at opretholde tilstanden gennem hele programmets kørselstid. Når vi først har oprettet en variabel og indstillet dens værdi, kan vi have fuld tillid til at vide, at værdien af den variabel aldrig vil ændre sig.
Fordele og ulemper ved funktionel programmering
Fordele:
- Rene funktioner er nemmere at forstå, fordi de ikke ændrer nogen tilstande og kun afhænger af input givet til dem. Uanset hvilket output de producerer, er den returværdi, de giver. Deres funktionssignatur giver alle oplysninger om dem, dvs. deres returtype og deres argumenter.
- Funktionelle programmeringssprogs evne til at behandle funktioner som værdier og overføre dem til funktioner som parametre gør koden mere læsbar og letforståelig.
- Test og fejlretning er nemmere. Da rene funktioner kun tager argumenter og producerer output, producerer de ingen ændringer, tager ikke input eller producerer noget skjult output. De bruger uforanderlige værdier, så det bliver nemmere at kontrollere nogle problemer i programmer skrevet bruger rene funktioner.
- Det bruges til at implementere samtidighed/parallelisme, fordi rene funktioner ikke ændrer variabler eller andre data uden for det.
- Den anvender doven evaluering, som undgår gentagen evaluering, fordi værdien evalueres og kun gemmes, når den er nødvendig.
Ulemper:
- Nogle gange kan skrivning af rene funktioner reducere kodens læsbarhed.
- At skrive programmer i rekursiv stil i stedet for at bruge loops kan være en smule skræmmende.
- Det er nemt at skrive rene funktioner, men det er en vanskelig opgave at kombinere dem med resten af applikationen og I/O-operationer.
- Uforanderlige værdier og rekursion kan føre til et fald i ydeevnen.
Ansøgninger:
- Det bruges i matematiske beregninger.
- Det er nødvendigt, hvor samtidighed eller parallelitet er påkrævet.
Fakta: Whatsapp har kun brug for 50 ingeniører til sine 900M brugere fordi Erlang bruges til at implementere dets samtidighedsbehov. Facebook bruger Haskell i sit anti-spam system.