- Osnovne ideje
- karakteristike
- Čiste funkcije
- Značajke prve klase
- Referentna transparentnost
- rekurzije
- Nepromjenljivost
- Primjeri
- Imperativni i deklarativni pristupi
- Čiste funkcije
- Funkcionira kao prvoklasni objekt
- Prednost
- Kraće i lakše razumljivo
- Nema kontrolnog protoka
- Nedostaci
- Prijave
- Funkcionalna metodologija
- Jezici koji podržavaju funkcionalno programiranje
- D
- Erlang
- Haskell
- ML
- Cilj Caml
- Shema
- Reference
U funkcionalni programski odgovara uzorku programiranje temelji se na konceptu navodi ponašanje programa kao funkcionalna matematički model, a ne eksplicitnim sekvenci naredbi na procesor, koji je glavni koncept u imperativ programiranje.
Funkcionalni jezik naglašava izjave i pojmove, a ne izvršavanje izjava. U ovom programiranju rezultat će ovisiti samo o parametrima koji su proslijeđeni nekoj funkciji, za razliku od drugih vrsta koje slušaju lokalno ili globalno stanje.
Dijagram kako funkcija mapiranja djeluje u Haskell funkcionalnom programskom jeziku. Izvor: Pluke - Vlastito djelo, CC0 commons.wikimedia.org.
Ime mu dolazi od matematičkih funkcija, koje su dodjela skupa ulaza skupu izlaza. Matematička funkcija zapravo ne radi ništa, već opisuje model procesa, objašnjavajući pomoću formule što skup ulaza proizvodi u funkciji.
Osnovne ideje
Temelj na kojem se temeljilo funkcionalno programiranje bio je lambda račun, koji je razvijen u trećem desetljeću 20. stoljeća za definiranje i primjenu funkcija. LISP je prvi takav programski jezik, dizajniran 1960. godine.
Iako se većina programskih jezika sastoji od ulaza, izlaza i vanjskih varijabli koje se mogu postaviti ili koristiti iz funkcija, funkcionalno programiranje to izbjegava. Ideja je da svaki put kad se funkcija nazove s istim parametrima, treba vratiti istu vrijednost.
karakteristike
Funkcionalni programski jezici nazivaju se aplikacije, jer se funkcije primjenjuju na njihove parametre, kao i na deklarativne i ne-proceduralne, jer definicije određuju što se izračunava, a ne kako se izračunava.
Čiste funkcije
Funkcija je čista kada nema vidljivih nuspojava, poput izmjene vanjskih varijabli, promjena datotečnog sustava i tako dalje.
Ove se funkcije smatraju uvjerljivim jer neće izričito promijeniti varijable od kojih u nekom trenutku mogu ovisiti drugi dijelovi koda. Činilo bi se nespretno kodirati se s tim ograničenjima, ali te bi se funkcije morale smatrati determinističkim, predvidljivim i komponirajućim.
Značajke prve klase
Funkcije se smatraju vrijednostima koje se mogu dodijeliti varijablama, tako da se mogu prenijeti i vratiti s drugih funkcija. Odnosno, funkcija se može koristiti kao parametar ili kao vrijednost koja se vraća.
To znači da se funkcija može prenijeti kao takva, a ne samo kao rezultat funkcije. Na primjer, razmotrite dvostruku (x) funkciju, koja vraća dvostruko veću vrijednost svog ulaznog parametra. Dakle, dvostruki (2) bi vratio 4.
Budući da je to funkcija prve klase, kôd (dvostruki (dvostruki (2)) bi bio isti kao kod dvostrukog (4). To vam omogućuje da ugnijezdi jednu funkciju kao parametar druge, i tako dalje.
Referentna transparentnost
Odnosi se na činjenicu da u ovom programskom obrascu nema izjava o dodjeli. Odnosno, morate definirati nove varijable ako želite pohraniti dodatne vrijednosti. Stoga je stanje varijable u svakom trenutku konstantno.
Ovo eliminira i najmanju mogućnost neželjenih učinaka, jer se bilo koja varijabla može zamijeniti njegovom stvarnom vrijednošću tijekom bilo koje točke izvođenja programa.
rekurzije
U funkcionalnom programiranju ne postoje petlje "za" i "dok". Umjesto toga, iteracija se oslanja na rekurziju. Rekurzija se provodi pomoću rekurzivnih funkcija, koje se ponavljaju ponavljajući sve dok se ne postigne osnovni slučaj.
Nepromjenljivost
Varijable su nepromjenjive, odnosno nije moguće mijenjati varijablu nakon što je inicijalizirana. Iako možete stvoriti novu varijablu, izmjena postojećih varijabli nije dopuštena.
Primjeri
Imperativni i deklarativni pristupi
Primjerom možete analizirati razliku između tih pristupa, izvodeći istu operaciju u oba aranžmana, a to je filtriranje neparnih brojeva s popisa, a zamjenjujući 5 za parne brojeve manje od 5.
To je isti izračun, s istim rezultatom. Međutim, kao što vidite, imperativni kod je iscrpan i nije odmah jasan. S druge strane, deklarativni pristup je čitljiv i izričit, jer se usredotočuje na ono što želite dobiti.
Čiste funkcije
Što se definira kao čista i nečista funkcija može se pojasniti nekim osnovnim primjerima:
Funkcionira kao prvoklasni objekt
Znači koristiti funkcije na isti način na koji se koriste podaci. Stoga se mogu prenijeti kao parametri drugoj funkciji. U sljedećem primjeru, int funkcija može se prenijeti kao parametar funkciji preslikavanja:
>>> popis (karta (int,))
Mogu se dodijeliti varijablama i vratiti ih. Na primjer, u sljedećem kôdu možete dodijeliti funkciju hello_world, a zatim izvršiti varijablu kao funkciju.
Prednost
- Usredotočite se na ono što želite postići (deklarativno), a ne na način kako to postići (imperativ).
- Ne sadrže izjave o dodjeli, pa se nakon što se varijablama dade vrijednost, više ne mijenjaju. Stoga funkcionalni programi ne sadrže nuspojave.
- Logički tok je jasan, jer je stanje manje raspršeno i nije implicitno modificirano.
- Podržava koncept lijenosti, što znači da se vrijednost procjenjuje i pohranjuje samo kad je potrebno.
- Budući da čiste funkcije ne mijenjaju nijedno stanje i potpuno ovise o unosu, lako ih je razumjeti. Povratna vrijednost koju daju takve funkcije jednaka je rezultatu koji su proizveli.
- Zbog prirode čistih funkcija kako bi se izbjeglo da se varijable ili bilo koji vanjski podatak promijeni, primjena istodobnosti postaje na snazi.
- Funkcije se tretiraju kao vrijednosti, a prelaze se na ostale funkcije kao parametri. To poboljšava razumijevanje i čitljivost koda.
- Čiste funkcije jedanput uzimaju parametre, proizvodeći nepromjenjivi izlaz. Korištenje nepromjenjivih vrijednosti olakšava uklanjanje pogrešaka i testiranje.
Kraće i lakše razumljivo
Kraći su i lakše ih je razumjeti nego imperativi. Studije su pokazale da je prosječna produktivnost programera u smislu kodnih redaka manje-više ista za bilo koji programski jezik, što pretvara u veću produktivnost.
Nema kontrolnog protoka
Pozivanje funkcije ne može imati drugačiji učinak od izračunavanja njezinog rezultata. Ovo isključuje glavni izvor pogrešaka, a poredak izvršenja čini irelevantnim, jer nijedna nuspojava ne može promijeniti vrijednost izraza, a može se procijeniti u bilo kojem trenutku.
Programer je oslobođen tereta uspostavljanja toka kontrole. Budući da se izrazi mogu ocijeniti u bilo kojem trenutku, varijable se mogu zamijeniti njihovim vrijednostima.
Ta autonomija funkcionalne programe čini matematički upravljivijima od konvencionalnih programa.
Nedostaci
- Paradigma funkcionalnog programiranja nije jednostavna, pa je početniku teško razumjeti.
- Teško je za održavanje, jer se tijekom kodiranja razvija mnogo objekata.
- U nekim slučajevima pisanje čistih funkcija uzrokuje smanjenje čitljivosti koda.
- Promjene vrijednosti u kombinaciji s rekurzijom mogu dovesti do drastičnog smanjenja performansi sustava.
- Ponovna upotreba je vrlo komplicirana i zahtijeva stalno preuređivanje.
- Pisanje programa u rekurzivnom stilu umjesto upotrebe petlje ili petlje može biti vrlo zastrašujući zadatak.
- Objekti možda neće ispravno predstaviti problem.
- Iako se pisanje čistih funkcija ispostavlja jednostavno, kombinirati ih s ostatkom aplikacije i operacijama ulaza / izlaza prilično je teško.
Prijave
Programiranje umjetne inteligencije vrši se na funkcionalnim programskim jezicima, a tehnike umjetne inteligencije prelaze na aplikacije u stvarnom svijetu.
Također se ističe u primjeni složenih matematičkih modela. Iz tog razloga jedna od glavnih upotreba funkcionalnih jezika tradicionalno je akademska. Korisno je za razvijanje izvršnih specifikacija i implementacija prototipa.
Mnogi se funkcionalni jezici također izvrsno primjenjuju u paralelnoj obradi. To je zbog njegove sposobnosti da iskoristi čiste funkcije, koje uvijek vraćaju istu vrijednost bez obzira na redoslijed kojim se izvode.
Funkcionalna metodologija
WhatsApp koristi programski jezik Erlang, koji slijedi funkcionalni model programiranja, omogućavajući više od stotinu svojih zaposlenika da obrađuju podatke koji pripadaju oko 1,6 milijardi ljudi.
Drugi važan nosilac funkcionalnog stila programiranja je Haskell. Koristi ga Facebook u svom antispam sustavu. Čak i JavaScript, jedan od najčešće korištenih programskih jezika, zasmeta svojstvima dinamički tipkanog funkcionalnog jezika.
Jezici koji podržavaju funkcionalno programiranje
D
Dizajniran je nakon C ++, uzimajući sve njegove prednosti istovremeno uklanjajući uočene slabosti kompatibilnosti s C.
Erlang
Visoko je skalabilan i istodoban, što ga čini idealnim za telekomunikacije i druge aplikacije koje primaju ogromne količine podataka nepredvidivim redoslijedom.
Haskell
Ovo je čisti funkcionalni programski jezik, koji koristi Lambda računicu.
ML
Koristi se u matematičkim, znanstvenim, financijskim, analitičkim i drugim primjenama. Jedna od njegovih prednosti je stvaranje softvera za rukovanje drugim programima.
Cilj Caml
Riječ je o jeziku otvorenog koda koji se temelji na Camlu. Ima tendenciju stvaranja vrlo laganih programa, pomažući im da se učitavaju i pokreću brže od onih koje stvaraju drugi jezici.
Shema
Temelji se na LISP sintaksi i ALGOL strukturi. Zbog svoje jednostavnosti, na mnogim se tečajevima informatike koristi kao uvod u dizajn programa kako bi se prikazale neke osnove računalnog programiranja.
Reference
- Tko ovo ugošćuje (2019.). Naučite funkcionalno programiranje: Taj će stil kodiranja raznijeti vaš um. Preuzeto sa: whoishostingthis.com.
- Andrea Bertoli (2019.). Adekvatni uvod u funkcionalno programiranje. Preuzeto iz: dev.to.
- Hakerska zemlja (2020). Funkcijsko programiranje. Preuzeto sa: hackerearth.com.
- Clojure (2020). Funkcijsko programiranje. Preuzeto sa: clojure.org.
- Akhil Bhadwal (2020). Funkcionalno programiranje: pojmovi, prednosti, nedostaci i aplikacije. Hack. Preuzeto iz: hackr.io.
- Guru99 (2020). Što je funkcionalno programiranje? Vodič s primjerom. Preuzeto sa: guru99.com.