logo

Paradigma funkcionalnega programiranja

Uvod
Funkcionalno programiranje je paradigma programiranja, v kateri poskušamo vse povezati v slogu čistih matematičnih funkcij. Je deklarativni tip programskega sloga. Njegov glavni poudarek je na tem, kaj rešiti, v nasprotju z imperativnim slogom, kjer je glavni poudarek na tem, kako rešiti. Namesto izjav uporablja izraze. Izraz se ovrednoti, da proizvede vrednost, medtem ko se stavek izvede za dodelitev spremenljivk. Te funkcije imajo nekatere posebne funkcije, ki so obravnavane spodaj.

Funkcionalno programiranje temelji na lambda računu:
Lambda račun je ogrodje, ki ga je razvil Alonzo Church za preučevanje izračunov s funkcijami. Lahko ga imenujemo najmanjši programski jezik na svetu. Poda definicijo, kaj je izračunljivo. Vse, kar je mogoče izračunati z lambda računom, je izračunljivo. Po svoji sposobnosti računanja je enakovreden Turingovemu stroju. Zagotavlja teoretični okvir za opisovanje funkcij in njihovo vrednotenje. Je osnova skoraj vseh trenutnih funkcionalnih programskih jezikov.
Dejstvo: Alan Turing je bil učenec Alonza Churcha, ki je ustvaril Turingov stroj, ki je postavil temelje imperativnega stila programiranja.



Programski jeziki, ki podpirajo funkcionalno programiranje: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.

pretvori niz v char

Koncepti funkcionalnega programiranja:

  • Čiste funkcije
  • Rekurzija
  • Referenčna preglednost Funkcije so prvorazredne in so lahko višjega reda Spremenljivke so nespremenljive

Čiste funkcije: Te funkcije imajo dve glavni lastnosti. Prvič, vedno ustvarijo enak rezultat za iste argumente, ne glede na kar koli drugega.
Drugič, nimajo stranskih učinkov, tj. ne spreminjajo nobenih argumentov ali lokalnih/globalnih spremenljivk ali vhodnih/izhodnih tokov.
Kasnejša lastnost se imenuje nespremenljivost. Edini rezultat čiste funkcije je vrednost, ki jo vrne. So deterministični.
Programe, izdelane s funkcionalnim programiranjem, je enostavno odpraviti, ker čiste funkcije nimajo stranskih učinkov ali skritih V/I. Čiste funkcije tudi olajšajo pisanje vzporednih/hkratnih aplikacij. Ko je koda napisana v tem slogu, lahko pametni prevajalnik naredi marsikaj – lahko vzporedi navodila, počaka, da oceni rezultate, ko jih potrebuje, in si jih zapomni, saj se rezultati nikoli ne spremenijo, dokler se vnos ne spremeni.
primer čiste funkcije:



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>

Rekurzija: V funkcionalnih jezikih ni zanke for ali while. Iteracija v funkcionalnih jezikih se izvaja z rekurzijo. Rekurzivne funkcije večkrat kličejo same sebe, dokler ne dosežejo osnovnega primera.
primer rekurzivne funkcije:

fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>

Referenčna preglednost: V funkcionalnih programih spremenljivke, ko so enkrat definirane, ne spremenijo svoje vrednosti v celotnem programu. Funkcionalni programi nimajo stavkov o dodelitvi. Če moramo neko vrednost shraniti, namesto tega definiramo nove spremenljivke. To odpravlja morebitne stranske učinke, ker je vsako spremenljivko mogoče zamenjati z njeno dejansko vrednostjo na kateri koli točki izvajanja. Stanje katere koli spremenljivke je konstantno v vsakem trenutku.

primer:



x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>

Funkcije so prvorazredne in so lahko višjega reda: Prvorazredne funkcije se obravnavajo kot prvorazredne spremenljivke. Spremenljivke prvega razreda je mogoče posredovati funkcijam kot parameter, vrniti jih je mogoče iz funkcij ali shraniti v podatkovne strukture. Funkcije višjega reda so funkcije, ki sprejmejo druge funkcije kot argumente in lahko tudi vrnejo funkcije.

nizovne metode java

primer:

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>

Spremenljivke so nespremenljive: V funkcionalnem programiranju ne moremo spremeniti spremenljivke, potem ko je bila inicializirana. Ustvarimo lahko nove spremenljivke – ne moremo pa spremeniti obstoječih spremenljivk, kar resnično pomaga vzdrževati stanje skozi ves čas izvajanja programa. Ko ustvarimo spremenljivko in nastavimo njeno vrednost, smo lahko popolnoma prepričani, da se vrednost te spremenljivke ne bo nikoli spremenila.

Prednosti in slabosti funkcionalnega programiranja

Prednosti:

  1. Čiste funkcije je lažje razumeti, ker ne spreminjajo nobenih stanj in so odvisne samo od vnosa, ki jim je dan. Ne glede na rezultat, ki ga proizvedejo, je povratna vrednost, ki jo dajo. Njihov funkcijski podpis daje vse informacije o njih, tj. njihovo vrnjeno vrsto in njihove argumente.
  2. Sposobnost funkcionalnih programskih jezikov, da funkcije obravnavajo kot vrednosti in jih posredujejo funkcijam kot parametre, naredi kodo bolj berljivo in lahko razumljivo.
  3. Preizkušanje in odpravljanje napak je lažje. Ker čiste funkcije sprejemajo samo argumente in proizvajajo izhodne podatke, ne ustvarjajo nobenih sprememb, ne sprejemajo vhodnih podatkov ali ustvarjajo nekaj skritih izhodnih podatkov. Uporabljajo nespremenljive vrednosti, zato je lažje preveriti nekatere težave v programih, napisanih z uporabo čistih funkcij.
  4. Uporablja se za izvajanje sočasnosti/vzporednosti, ker čiste funkcije ne spreminjajo spremenljivk ali drugih podatkov zunaj njih.
  5. Sprejema leno vrednotenje, ki se izogne ​​ponovnemu vrednotenju, ker je vrednost ovrednotena in shranjena le, ko je potrebna.

Slabosti:

stdin v c
  1. Včasih lahko pisanje čistih funkcij zmanjša berljivost kode.
  2. Pisanje programov v rekurzivnem slogu namesto z uporabo zank je lahko nekoliko zastrašujoče.
  3. Pisanje čistih funkcij je enostavno, vendar je njihovo združevanje s preostalimi aplikacijami in V/I operacijami težka naloga.
  4. Nespremenljive vrednosti in rekurzija lahko povzročijo zmanjšanje zmogljivosti.

Aplikacije:

  • Uporablja se v matematičnih izračunih.
  • Potreben je tam, kjer je potrebna sočasnost ali vzporednost.

Dejstvo: Whatsapp potrebuje samo 50 inženirjev za svojih 900M uporabniki ker se Erlang uporablja za izvajanje svojih potreb po sočasnosti. Facebook uporablja Haskell v svojem sistemu za zaščito pred vsiljeno pošto.