- Pagrindinės idėjos
- charakteristikos
- Grynos funkcijos
- Pirmos klasės savybės
- Referencinis skaidrumas
- Rekursija
- Nepakeičiamumas
- Pavyzdžiai
- Imperatyvus ir deklaratyvus požiūris
- Grynos funkcijos
- Funkcijos kaip pirmos klasės objektai
- Privalumas
- Trumpesnis ir suprantamesnis
- Nėra valdymo srauto
- Trūkumai
- Programos
- Funkcinė metodika
- Kalbos, palaikančios funkcinį programavimą
- D
- Erlangas
- Haskell
- ML
- Objektyvus Camlas
- Schema
- Nuorodos
Į Funkcinis programavimas atitinka modelio programavimo remiantis nurodant programos elgesį kaip funkcinis matematinio modelio, o ne aiškiais sekas Nurodymai procesorius, kuris yra pagrindinė sąvoka imperatyvaus programavimo koncepciją.
Funkcinė kalba pabrėžia teiginius ir terminus, o ne vykdo teiginius. Atliekant šį programavimą rezultatas priklausys tik nuo parametrų, kurie perduodami funkcijai, skirtingai nuo kitų tipų, kurie paklūsta vietinei ar globaliai būklei.
Diagrama, kaip žemėlapio funkcija veikia „Haskell“ funkcinio programavimo kalba. Šaltinis: Autorius Pluke - Nuosavas darbas, CC0 commons.wikimedia.org.
Jo pavadinimas kilęs iš matematinių funkcijų, kurios yra įvesties rinkinio priskyrimas išėjimų rinkiniui. Matematinė funkcija iš tikrųjų neatlieka jokio darbo, o greičiau apibūdina proceso modelį, formulės pagalba paaiškindama, koks įvesties rinkinys sukuria funkciją.
Pagrindinės idėjos
Funkcinio programavimo pagrindas buvo „lambda calculus“, kuris buvo sukurtas XX amžiaus trečiajame dešimtmetyje funkcijoms apibrėžti ir pritaikyti. LISP buvo pirmoji tokio tipo programavimo kalba, sukurta 1960 m.
Nors daugumą programavimo kalbų sudaro įėjimai, išėjimai ir išoriniai kintamieji, kuriuos galima nustatyti arba naudoti iš funkcijų, funkcinio programavimo to išvengiama. Idėja yra ta, kad kiekvieną kartą, kai funkcija iškviečiama su tais pačiais parametrais, ji turėtų grąžinti tą pačią vertę.
charakteristikos
Funkcinio programavimo kalbos vadinamos programomis, nes funkcijos yra pritaikomos jų parametrams, taip pat deklaratyvioms ir neprocedūrinėms, nes apibrėžimai nurodo, kas turi būti apskaičiuojama, o ne kaip ji apskaičiuojama.
Grynos funkcijos
Funkcija yra gryna, kai ji neturi pastebimo šalutinio poveikio, pvz., Keičia išorinius kintamuosius, failų sistemos pakeitimus ir pan.
Šios funkcijos laikomos įtikinamomis, nes jos aiškiai nepakeis jokių kintamųjų, nuo kurių tam tikru momentu gali priklausyti kitos kodo dalys. Kovoti su šiais apribojimais atrodytų nepatogu, tačiau šios funkcijos turi būti laikomos deterministinėmis, nuspėjamomis ir sudėtinėmis.
Pirmos klasės savybės
Funkcijos laikomos reikšmėmis, kurias galima priskirti kintamiesiems, todėl jos gali būti perduotos kitoms funkcijoms ir sugrąžintos iš jų. T. y., Funkcija gali būti naudojama kaip parametras arba kaip vertė, kuri grąžinama.
Tai reiškia, kad funkcija gali būti perduodama kaip tokia, o ne tik funkcijos rezultatas. Pavyzdžiui, apsvarstykite dvigubą (x) funkciją, kuri grąžina dvigubai didesnę jo įvesties parametro vertę. Taigi dviguba (2) grąžintų 4.
Kadangi tai yra pirmosios klasės funkcija, kodas (dvigubas (dvigubas (2)) būtų toks pat kaip dvigubo (4). Tai leidžia įterpti vieną funkciją kaip kitos parametrą ir pan.
Referencinis skaidrumas
Tai reiškia, kad šiame programavimo modelyje nėra priskyrimo teiginių. T. y., Jei norite saugoti papildomas reikšmes, turite apibrėžti naujus kintamuosius. Todėl kintamojo būsena visą laiką yra pastovi.
Tai pašalina menkiausią nepageidaujamų efektų galimybę, nes bet kurį kintamąjį bet kuriame programos vykdymo taške gali pakeisti tikroji jo vertė.
Rekursija
Funkciniame programavime nėra „už“ ir „o“ kilpų. Vietoj to, iteracija priklauso nuo rekursijos. Rekursija vykdoma pasitelkiant rekursines funkcijas, kurios kartojasi tol, kol pasiekiamas pagrindinis atvejis.
Nepakeičiamumas
Kintamieji yra nekintami, ty neįmanoma modifikuoti kintamojo, kai jis yra inicializuotas. Nors galite sukurti naują kintamąjį, modifikuoti esamus kintamuosius neleidžiama.
Pavyzdžiai
Imperatyvus ir deklaratyvus požiūris
Pateikdami pavyzdį galite išanalizuoti skirtumą tarp šių metodų, atlikdami tą pačią operaciją abiem sistemomis, ty filtruodami nelyginius skaičius iš sąrašo, o lyginius skaičius mažesniais nei 5 pakeisdami 5.
Tai tas pats skaičiavimas, gaunamas tas pats rezultatas. Tačiau, kaip matote, imperatyvus kodas yra aiškus ir ne iš karto aiškus. Kita vertus, deklaratyvus požiūris yra lengvai skaitomas ir aiškus, nes jis sutelkia dėmesį į tai, ko norite gauti.
Grynos funkcijos
Tai, kas apibūdinama kaip grynos ir nešvarios funkcijos, gali būti paaiškinta keliais pagrindiniais pavyzdžiais:
Funkcijos kaip pirmos klasės objektai
Tai reiškia naudoti funkcijas taip pat, kaip ir duomenys. Todėl jie gali būti perduodami kaip parametrai kitai funkcijai. Šiame pavyzdyje int funkcija gali būti perduodama kaip žemėlapio funkcijos parametras:
>>> sąrašas (žemėlapis (int))
Juos galima priskirti kintamiesiems ir grąžinti. Pavyzdžiui, šiame kode galite priskirti funkciją hello_world, tada vykdyti kintamąjį kaip funkciją.
Privalumas
- Susitelkite ties tuo, ką norite pasiekti (deklaratyviai), o ne į tai, kaip tai pasiekti (imperatyvu).
- Juose nėra priskyrimo teiginių, taigi, kai kintamiesiems bus suteikta vertė, jie nebesikeis. Todėl funkcinės programos neturi jokio šalutinio poveikio.
- Loginis srautas yra aiškus, nes būsena yra mažiau išsklaidyta ir nėra netiesiogiai modifikuota.
- palaiko tinginio vertinimo koncepciją, kuri reiškia, kad vertė vertinama ir saugoma tik tada, kai reikia.
- Kadangi grynos funkcijos nekeičia jokios būsenos ir yra visiškai priklausomos nuo įvesties, jas lengva suprasti. Tokių funkcijų grąžinama vertė yra tokia pati kaip jų sukurto rezultato.
- Dėl grynųjų funkcijų pobūdžio, siekiant išvengti kintamųjų ar bet kokių išorinių duomenų pasikeitimo, lygiavertiškumas įgyvendinamas.
- Funkcijos traktuojamos kaip vertės, perduodamos kitoms funkcijoms kaip parametrai. Tai pagerina kodo supratimą ir skaitomumą.
- Grynos funkcijos vieną kartą perima parametrus ir sukuria nekintamą išvestį. Nepakeičiamų verčių naudojimas palengvina derinimo ir testavimo darbus.
Trumpesnis ir suprantamesnis
Jie yra trumpesni ir lengviau suprantami nei imperatyvai. Tyrimai parodė, kad vidutinis programuotojo produktyvumas kodo eilučių atžvilgiu yra beveik vienodas bet kuriai programavimo kalbai, o tai reiškia didesnį našumą.
Nėra valdymo srauto
Funkcijos iškvietimas negali turėti kitokio efekto, nei apskaičiuojant jos rezultatą. Tai pašalina pagrindinį klaidų šaltinį, taip pat vykdymo tvarką padaro nereikšmingą, nes joks šalutinis poveikis negali pakeisti išraiškos vertės ir ją bet kada galima įvertinti.
Programuotojas atleidžiamas nuo kontrolės srauto nustatymo naštos. Kadangi išraiškas galima bet kada įvertinti, kintamuosius galima pakeisti jų reikšmėmis.
Dėl šios autonomijos funkcinės programos yra labiau matematiškai valdomos nei įprastos.
Trūkumai
- Funkcinio programavimo paradigma nėra paprasta, todėl pradedančiajam tai sunku suprasti.
- Sunku išlaikyti, nes daug objektų vystosi kodavimo metu.
- Kai kuriais atvejais grynų funkcijų rašymas sumažina kodo skaitomumą.
- Nekeičiamos vertės kartu su rekursija gali smarkiai sumažinti sistemos našumą.
- Pakartotinis naudojimas yra labai sudėtingas ir reikalauja nuolatinio reagavimo.
- Programų rašymas rekursyviniu būdu, užuot naudojant kilpas ar kilpas, gali būti labai bauginanti užduotis.
- Objektai gali netinkamai parodyti problemą.
- Nors grynų funkcijų rašymas pasirodo paprastas, jas sudėtinga derinti su likusia programa ir įvesties / išvesties operacijomis.
Programos
Dirbtinio intelekto programavimas atliekamas funkcinio programavimo kalbomis, o dirbtinio intelekto metodai pereina į realaus pasaulio programas.
Tai taip pat puikiai tinka įgyvendinant sudėtingus matematinius modelius. Dėl šios priežasties vienas pagrindinių funkcinių kalbų naudojimo būdų tradiciškai buvo akademinis. Tai naudinga kuriant vykdomas specifikacijas ir prototipų įgyvendinimus.
Daugelis funkcinių kalbų taip pat puikiai tinka įgyvendinant lygiagretųjį apdorojimą. Taip yra dėl jos sugebėjimo pasinaudoti grynosiomis funkcijomis, kurios visada grąžina tą pačią vertę, nepriklausomai nuo jų vykdymo tvarkos.
Funkcinė metodika
„WhatsApp“ naudoja „Erlang“ programavimo kalbą, kuri atitinka funkcinio programavimo modelį, taigi daugiau nei šimtui jos darbuotojų leidžiama tvarkyti duomenis, priklausančius maždaug 1,6 milijardo žmonių.
Kitas svarbus funkcinio programavimo stiliaus nešėjas yra „Haskell“. „Facebook“ ją naudoja antispam sistemoje. Net „JavaScript“, viena iš plačiausiai naudojamų programavimo kalbų, pasižymi dinamiškai įvestos funkcinės kalbos savybėmis.
Kalbos, palaikančios funkcinį programavimą
D
Jis buvo sukurtas po C ++, gaudamas visą jo naudą ir pašalindamas pastebėtus trūkumus, kad turi būti suderinamas su C.
Erlangas
Jis yra labai keičiamas ir lygiagretus, todėl jis idealiai tinka telekomunikacijų ir kitoms programoms, kurios nenuspėjama tvarka gauna didžiulį duomenų kiekį.
Haskell
Tai gryna funkcinė programavimo kalba, kuriai naudojami „Lambda“ skaičiavimai.
ML
Jis naudojamas matematinėse, mokslinėse, finansinėse, analitinėse ir kitose srityse. Vienas iš jos privalumų yra programinės įrangos, skirtos kitoms programoms valdyti, kūrimas.
Objektyvus Camlas
Tai yra atvirojo kodo kalba, paremta Caml. Jis linkęs kurti labai lengvas programas, padėdamas jas įkelti ir paleisti greičiau nei sukurtos kitomis kalbomis.
Schema
Jis pagrįstas LISP sintakse ir ALGOL struktūra. Dėl savo paprastumo jis naudojamas daugelyje informatikos kursų kaip įvadas į programos sudarymą, siekiant parodyti kai kuriuos kompiuterio programavimo pagrindus.
Nuorodos
- Kas tai priima (2019 m.). Sužinokite apie funkcinį programavimą: šis kodavimo stilius užtemdys jūsų mintis. Paimta iš: whoishostingthis.com.
- Andrea Bertoli (2019 m.). Tinkamas įvadas į funkcinį programavimą. Paimta iš: dev.to.
- „Hacker Earth“ (2020 m.). Funkcinis programavimas. Paimta iš: hackerearth.com.
- Clojure (2020). Funkcinis programavimas. Paimta iš: clojure.org.
- Akhil Bhadwal (2020). Funkcinis programavimas: sąvokos, privalumai, trūkumai ir programos. Hack. Paimta iš: hackr.io.
- „Guru99“ (2020). Kas yra funkcinis programavimas? Vadovėlis su pavyzdžiu. Paimta iš: guru99.com.