Įvadas
Funkcinis programavimas yra programavimo paradigma, kurioje mes stengiamės viską susieti grynu matematinių funkcijų stiliumi. Tai deklaratyvus programavimo stiliaus tipas. Jo pagrindinis dėmesys skiriamas tam, ką išspręsti, priešingai nei imperatyvus stilius, kuriame pagrindinis dėmesys skiriamas kaip išspręsti. Vietoj teiginių naudojami posakiai. Išraiška įvertinama, kad būtų gauta reikšmė, o sakinys vykdomas norint priskirti kintamuosius. Šios funkcijos turi keletą ypatingų savybių, aptartų toliau.
Funkcinis programavimas pagrįstas lambda skaičiavimu:
Lambda skaičiavimas yra Alonzo Church sukurta sistema, skirta skaičiavimams su funkcijomis tirti. Tai gali būti vadinama mažiausia programavimo kalba pasaulyje. Tai apibrėžia, kas yra apskaičiuojama. Viskas, ką galima apskaičiuoti lambda skaičiavimu, yra apskaičiuojama. Savo gebėjimu skaičiuoti jis prilygsta Tiuringo mašinai. Jame pateikiami teoriniai pagrindai funkcijoms aprašyti ir jų vertinimui. Tai yra beveik visų dabartinių funkcinių programavimo kalbų pagrindas.
Faktas: Alanas Turingas buvo Alonzo Church mokinys, sukūręs Tiuringo mašiną, padėjusią imperatyvaus programavimo stiliaus pamatą.
Programavimo kalbos, palaikančios funkcinį programavimą: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.
Funkcinio programavimo sąvokos:
- Grynos funkcijos
- Rekursija Referencinės skaidrumo funkcijos yra pirmos klasės ir gali būti aukštesnės eilės kintamieji yra nekintantys
Grynosios funkcijos: Šios funkcijos turi dvi pagrindines savybes. Pirma, jie visada pateikia tą patį rezultatą tiems patiems argumentams, nepaisant nieko kito.
Antra, jie neturi šalutinio poveikio, ty nekeičia jokių argumentų ar vietinių / visuotinių kintamųjų arba įvesties / išvesties srautų.
Vėliau savybė vadinama nekintamumu. Vienintelis grynosios funkcijos rezultatas yra jos grąžinama vertė. Jie yra deterministiniai.
Programas, sukurtas naudojant funkcinį programavimą, lengva derinti, nes grynos funkcijos neturi šalutinio poveikio ar paslėptų I/O. Grynos funkcijos taip pat palengvina lygiagrečių / lygiagrečių programų rašymą. Kai kodas parašytas tokiu stiliumi, išmanusis kompiliatorius gali padaryti daug dalykų – gali lygiagretinti instrukcijas, palaukti, kol įvertins rezultatus, kai jų prireiks, ir įsiminti rezultatus, nes rezultatai niekada nesikeičia, kol nesikeičia įvestis.
grynosios funkcijos pavyzdys:
dvejetainis medis
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>
Rekursija: Funkcinėse kalbose nėra ciklo for arba while. Iteracija funkcinėmis kalbomis įgyvendinama per rekursiją. Rekursyvinės funkcijos pakartotinai skambina, kol pasiekia bazinę raidę.
rekursinės funkcijos pavyzdys:
fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>
Referencinis skaidrumas: Funkcinėse programose vieną kartą apibrėžti kintamieji nekeičia savo reikšmės visoje programoje. Funkcinės programos neturi priskyrimo teiginių. Jei turime išsaugoti kokią nors reikšmę, vietoj to apibrėžiame naujus kintamuosius. Tai pašalina bet kokią šalutinio poveikio tikimybę, nes bet kurį kintamąjį galima pakeisti jo faktine verte bet kuriame vykdymo taške. Bet kurio kintamojo būsena yra pastovi bet kuriuo momentu.
Pavyzdys:
x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>
Funkcijos yra pirmos klasės ir gali būti aukštesnės eilės: Pirmos klasės funkcijos traktuojamos kaip pirmos klasės kintamieji. Pirmosios klasės kintamieji gali būti perduodami funkcijoms kaip parametrai, gali būti grąžinami iš funkcijų arba saugomi duomenų struktūrose. Aukštesnės eilės funkcijos yra funkcijos, kurios kitas funkcijas priima kaip argumentus ir taip pat gali grąžinti funkcijas.
Pavyzdys:
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> Kintamieji yra nekintantys: Funkcinio programavimo metu negalime keisti kintamojo, kai jis buvo inicijuotas. Galime kurti naujus kintamuosius, bet negalime keisti esamų kintamųjų, o tai tikrai padeda išlaikyti būseną per visą programos vykdymo laiką. Sukūrę kintamąjį ir nustatę jo vertę, galime visiškai pasitikėti, žinodami, kad to kintamojo reikšmė niekada nepasikeis.
int konvertavimas į eilutę Java
Funkcinio programavimo privalumai ir trūkumai
Privalumai:
- Grynas funkcijas lengviau suprasti, nes jos nekeičia jokių būsenų ir priklauso tik nuo joms pateiktos įvesties. Nepriklausomai nuo jų pagamintos produkcijos grąžinimo vertės jie suteikia. Jų funkcijos parašas suteikia visą informaciją apie juos, ty jų grąžinimo tipą ir argumentus.
- Funkcinių programavimo kalbų galimybė funkcijas traktuoti kaip reikšmes ir perduoti jas funkcijoms kaip parametrus, todėl kodas tampa lengviau skaitomas ir lengviau suprantamas.
- Bandymas ir derinimas yra lengvesnis. Kadangi grynos funkcijos ima tik argumentus ir sukuria išvestį, jos nevykdo jokių pakeitimų, nepriima įvesties ar sukuria paslėptą išvestį. Jie naudoja nekintamas reikšmes, todėl lengviau patikrinti kai kurias problemas programose, parašytose naudojant grynas funkcijas.
- Jis naudojamas lygiagretumui / lygiagretumui įgyvendinti, nes grynos funkcijos nekeičia kintamųjų ar jokių kitų duomenų už jos ribų.
- Jis priima tingų vertinimą, kuris vengia pakartotinio vertinimo, nes vertė įvertinama ir išsaugoma tik tada, kai jos reikia.
Trūkumai:
- Kartais grynų funkcijų rašymas gali sumažinti kodo skaitomumą.
- Rašyti programas rekursiniu stiliumi, o ne naudoti kilpas, gali būti šiek tiek bauginanti.
- Paprastų funkcijų rašymas yra paprastas, tačiau jas derinti su likusia programa ir įvesties / išvesties operacijomis yra sudėtinga užduotis.
- Dėl nekintamų verčių ir pasikartojimo gali sumažėti našumas.
Programos:
- Jis naudojamas matematiniuose skaičiavimuose.
- Jis reikalingas ten, kur reikalingas lygiagretumas arba lygiagretumas.
Faktas: „Whatsapp“ reikia tik 50 inžinierių savo 900 mln vartotojų nes Erlang yra naudojamas įgyvendinti savo lygiagretumo poreikius. „Facebook“ naudoja „Haskell“ savo anti-spam sistemoje.