- Základní myšlenky
- vlastnosti
- Čisté funkce
- Prvotřídní funkce
- Referenční průhlednost
- Rekurze
- Neměnitelnost
- Příklady
- Imperativní a deklarativní přístupy
- Čisté funkce
- Funkce jako prvotřídní objekty
- Výhoda
- Kratší a snáze pochopitelný
- Žádný regulační tok
- Nevýhody
- Aplikace
- Funkční metodologie
- Jazyky, které podporují funkční programování
- D
- Erlang
- Haskell
- ML
- Cíl Caml
- Systém
- Reference
Tyto funkční programovací odpovídá programování vzoru je založen na konceptu uvedením chování programu jako funkční matematický model, spíše než explicitní sekvencemi instrukcí do procesoru, což je hlavní koncept v imperativním programování.
Funkční jazyk klade důraz spíše na výroky a termíny než na provádění výroků. V tomto programování bude výsledek záviset pouze na parametrech, které jsou předávány funkci, na rozdíl od jiných typů, které dodržují místní nebo globální stav.
Schéma fungování mapovací funkce ve funkčním programovacím jazyce Haskell. Zdroj: By Pluke - vlastní práce, CC0 commons.wikimedia.org.
Jeho název vychází z matematických funkcí, které jsou přiřazením sady vstupů k sadě výstupů. Matematická funkce ve skutečnosti nedělá žádnou práci, nýbrž spíše popisuje model procesu a vysvětluje pomocí vzorce, co sada vstupů vytváří ve funkci.
Základní myšlenky
Základem funkčního programování byl lambda kalkul, který byl vyvinut ve třetí dekádě 20. století k definování a aplikaci funkcí. LISP byl první programovací jazyk svého druhu, navržený v roce 1960.
Ačkoli většina programovacích jazyků sestává ze vstupů, výstupů a externích proměnných, které lze nastavit nebo použít z funkcí, programování se tomu vyhýbá. Myšlenka je, že pokaždé, když je funkce vyvolána se stejnými parametry, měla by vrátit stejnou hodnotu.
vlastnosti
Funkční programovací jazyky se nazývají aplikace, protože funkce jsou aplikovány na jejich parametry, jakož i na deklarativní a neprocesorové, protože definice specifikují, co se má vypočítat, a ne jak se počítá.
Čisté funkce
Funkce je čistá, pokud nemá žádné pozorovatelné vedlejší účinky, například změnu vnějších proměnných, změny systému souborů atd.
Tyto funkce jsou považovány za přesvědčivé, protože výslovně nezmění žádné proměnné, na kterých by v určitém okamžiku mohly záviset další části kódu. Zdálo by se nepříjemné kódovat s těmito omezeními, ale tyto funkce by měly být považovány za deterministické, předvídatelné a složitelné.
Prvotřídní funkce
Funkce jsou považovány za hodnoty, které lze přiřadit proměnným, takže je lze předat a vrátit z jiných funkcí. To znamená, že funkci lze použít, jako by se jednalo o parametr nebo jako vrácenou hodnotu.
To znamená, že funkce může být předávána jako taková, nikoli pouze výsledek funkce. Zvažte například funkci double (x), která vrací dvojnásobek hodnoty vstupního parametru. Dvojitá (2) by tedy vrátila 4.
Protože se jedná o funkci první třídy, kód (double (double (2))) by byl stejný jako kód double (4). To vám umožní vnořit jednu funkci jako parametr jiné atd.
Referenční průhlednost
Poukazuje na skutečnost, že v tomto vzorci programování neexistují žádné přiřazovací příkazy. To znamená, že pokud chcete uložit další hodnoty, musíte definovat nové proměnné. Stav proměnné je proto za všech okolností konstantní.
Tím se eliminuje nejmenší možnost nežádoucích účinků, protože libovolná proměnná může být nahrazena její skutečnou hodnotou během jakéhokoli bodu provádění programu.
Rekurze
Ve funkčním programování neexistují žádné smyčky „for“ a „while“. Místo toho se iterace spoléhá na rekurzi. Rekurze je implementována pomocí rekurzivních funkcí, které se opakovaně nazývají, dokud není dosaženo základního případu.
Neměnitelnost
Proměnné jsou neměnné, to znamená, že po inicializaci není možné měnit proměnnou. Přestože můžete vytvořit novou proměnnou, úprava stávajících proměnných není povolena.
Příklady
Imperativní a deklarativní přístupy
Na příkladu můžete analyzovat rozdíl mezi těmito přístupy a provádět stejnou operaci v obou uspořádáních, což znamená filtrovat lichá čísla ze seznamu a nahrazovat sudá čísla menší než 5.
Je to stejný výpočet se stejným výsledkem. Jak však vidíte, imperativní kód je podrobný a není okamžitě jasný. Na druhou stranu je deklarativní přístup čitelný a jednoznačný, protože se zaměřuje na to, co chcete získat.
Čisté funkce
To, co je definováno jako čisté a nečisté funkce, lze objasnit několika základními příklady:
Funkce jako prvotřídní objekty
To znamená používat funkce stejným způsobem, jakým se používají data. Proto je lze předat jako parametry jiné funkci. V následujícím příkladu lze funkci int předat jako parametr funkci mapy:
>>> seznam (mapa (int,))
Mohou být přiřazeny k proměnným a vráceny. Například v následujícím kódu můžete přiřadit funkci hello_world a poté provést proměnnou jako funkci.
Výhoda
- Zaměřte se na to, čeho chcete dosáhnout (deklarativní), a ne na to, jak toho dosáhnout (imperativ).
- Neobsahují příkazy přiřazení, takže po zadání proměnných se již nebudou měnit. Proto funkční programy neobsahují žádné vedlejší účinky.
- Logický tok je jasný, protože stav je méně rozptýlený a není implicitně upraven.
- Podporuje koncept líného vyhodnocení, což znamená, že hodnota je vyhodnocena a uložena pouze v případě potřeby.
- Jelikož čisté funkce nemění žádný stav a jsou zcela závislé na vstupu, lze je snadno pochopit. Návratová hodnota daná takovými funkcemi je stejná jako jejich výsledný výsledek.
- Vzhledem k povaze čistých funkcí, aby se zabránilo změnám proměnných nebo jakýchkoli externích údajů, se implementace souběžnosti stane účinnou.
- Funkce jsou považovány za hodnoty, přecházející na jiné funkce jako parametry. To zlepšuje porozumění a čitelnost kódu.
- Čisté funkce berou parametry jednou a vytvářejí neměnný výstup. Použití neměnných hodnot usnadňuje ladění a testování.
Kratší a snáze pochopitelný
Jsou kratší a snáze pochopitelné než imperativy. Studie ukázaly, že průměrná produktivita programátorů, pokud jde o řádky kódu, je víceméně stejná pro jakýkoli programovací jazyk, což se projevuje ve vyšší produktivitě.
Žádný regulační tok
Volání funkce nemůže mít jiný účinek než výpočet jejího výsledku. To vylučuje hlavní zdroj chyb a také činí pořadí provádění irelevantní, protože žádný vedlejší účinek nemůže změnit hodnotu výrazu a může být kdykoli vyhodnocen.
Programátor je zproštěn zátěže spojené s vytvářením toku kontroly. Protože výrazy lze vyhodnocovat kdykoli, mohou být proměnné nahrazeny jejich hodnotami.
Díky této autonomii jsou funkční programy matematicky spravovatelnější než běžné programy.
Nevýhody
- Funkční programovací paradigma není jednoduchá, proto je pro začátečníka obtížné porozumět.
- Je obtížné jej udržovat, protože během kódování se vyvíjí mnoho objektů.
- V některých případech způsobí zápis čistých funkcí snížení čitelnosti kódu.
- Neměnné hodnoty v kombinaci s rekurzí mohou vést k drastickému snížení výkonu systému.
- Opakované použití je velmi komplikované a vyžaduje neustálé refaktoringování.
- Psaní programů rekurzivním stylem namísto použití smyček nebo smyček může být velmi skličující úkol.
- Objekty nemusí problém reprezentovat správně.
- Přestože se zápis čistých funkcí ukazuje jako jednoduchý, jejich kombinace se zbytkem aplikace a se vstupními / výstupními operacemi je poměrně obtížná.
Aplikace
Programování umělé inteligence se provádí ve funkčních programovacích jazycích a techniky umělé inteligence přecházejí do aplikací skutečného světa.
Vyniká také při implementaci komplexních matematických modelů. Z tohoto důvodu je jedním z hlavních použití funkčních jazyků tradičně akademický jazyk. Je to užitečné pro vývoj spustitelných specifikací a implementací prototypů.
Mnoho funkčních jazyků také vyniká při implementaci paralelního zpracování. Je to kvůli jeho schopnosti využívat čistě funkce, které vždy vracejí stejnou hodnotu bez ohledu na pořadí, v jakém jsou prováděny.
Funkční metodologie
WhatsApp používá programovací jazyk Erlang, který se řídí funkčním programovacím modelem, a umožňuje tak více než stovce zaměstnanců zpracovávat data patřící přibližně 1,6 miliardám lidí.
Dalším důležitým nositelem funkčního programovacího stylu je Haskell. Používá ho Facebook ve svém antispamovém systému. I JavaScript, jeden z nejpoužívanějších programovacích jazyků, vychloubá vlastnosti dynamicky zadaného funkčního jazyka.
Jazyky, které podporují funkční programování
D
Byl navržen po C ++ a získával všechny své výhody a eliminoval své pozorované slabé stránky, že musí být kompatibilní s C.
Erlang
Je vysoce škálovatelný a souběžný, takže je ideální pro telekomunikace a další aplikace, které přijímají obrovské množství dat v nepředvídatelném pořadí.
Haskell
Toto je čistě funkční programovací jazyk, který používá Lambda počet.
ML
Používá se v matematických, vědeckých, finančních, analytických a dalších aplikacích. Jednou z jeho silných stránek je tvorba softwaru pro zpracování dalších programů.
Cíl Caml
Je to open source jazyk, který je založen na Camlu. Má tendenci vytvářet velmi lehké programy, což jim pomáhá načítat a běžet rychleji než programy vytvořené jinými jazyky.
Systém
Je založen na syntaxi LISP a struktuře ALGOL. Vzhledem k jeho jednoduchosti se používá v mnoha kurzech informatiky jako úvod do programového designu, který ukazuje některé základy počítačového programování.
Reference
- Kdo to hostí (2019). Naučte se funkční programování: Tento styl kódování vám vyhodí mysl. Převzato z: whoishostingthis.com.
- Andrea Bertoli (2019). Adekvátní úvod do funkčního programování. Převzato z: dev.to.
- Hacker Earth (2020). Funkcionální programování. Převzato z: hackerearth.com.
- Clojure (2020). Funkcionální programování. Převzato z: clojure.org.
- Akhil Bhadwal (2020). Funkční programování: Koncepty, výhody, nevýhody a aplikace. Zaseknout. Převzato z: hackr.io.
- Guru99 (2020). Co je funkční programování? Výukový program s příkladem. Převzato z: guru99.com.