logo

Paradigma funkcionálního programování

Úvod
Funkcionální programování je programovací paradigma, ve kterém se snažíme vše svázat ve stylu čistě matematických funkcí. Je to deklarativní typ programovacího stylu. Jeho hlavní zaměření je na to, co řešit, na rozdíl od imperativního stylu, kde je hlavní důraz kladen na to, jak vyřešit. Místo příkazů používá výrazy. Výraz je vyhodnocen tak, aby vytvořil hodnotu, zatímco příkaz je proveden k přiřazení proměnných. Tyto funkce mají některé speciální vlastnosti popsané níže.

Funkční programování je založeno na Lambda Calculus:
Lambda kalkul je rámec vyvinutý Alonzem Churchem pro studium výpočtů s funkcemi. Lze jej označit za nejmenší programovací jazyk na světě. Poskytuje definici toho, co je vyčíslitelné. Cokoli, co lze vypočítat pomocí lambda kalkulu, je vypočitatelné. Je ekvivalentní Turingovu stroji ve své schopnosti počítat. Poskytuje teoretický rámec pro popis funkcí a jejich hodnocení. Tvoří základ téměř všech současných funkcionálních programovacích jazyků.
Skutečnost: Alan Turing byl studentem Alonza Churche, který vytvořil Turingův stroj, který položil základy imperativního programovacího stylu.



Programovací jazyky, které podporují funkcionální programování: Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.

Koncepty funkcionálního programování:

  • Čisté funkce
  • Rekurze
  • Referenční transparentnost Funkce jsou prvotřídní a mohou být vyššího řádu Proměnné jsou neměnné

Čisté funkce: Tyto funkce mají dvě hlavní vlastnosti. Za prvé, vždy produkují stejný výstup pro stejné argumenty bez ohledu na cokoli jiného.
Za druhé, nemají žádné vedlejší účinky, tj. nemodifikují žádné argumenty ani lokální/globální proměnné nebo vstupní/výstupní toky.
Pozdější vlastnost se nazývá neměnnost. Jediným výsledkem čisté funkce je hodnota, kterou vrací. Jsou deterministické.
Programy vytvořené pomocí funkčního programování lze snadno ladit, protože čisté funkce nemají žádné vedlejší účinky nebo skryté I/O. Čisté funkce také usnadňují psaní paralelních/souběžných aplikací. Když je kód napsán tímto stylem, chytrý kompilátor může dělat mnoho věcí – může paralelizovat instrukce, čekat na vyhodnocení výsledků, když je potřebuje, a zapamatovat si výsledky, protože výsledky se nikdy nezmění, dokud se nezmění vstup.
příklad čisté funkce:



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>

Rekurze: Ve funkčních jazycích nejsou žádné smyčky for nebo while. Iterace ve funkcionálních jazycích je implementována pomocí rekurze. Rekurzivní funkce opakovaně volají samy sebe, dokud nedosáhnou základního případu.
příklad rekurzivní funkce:

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

Referenční transparentnost: Ve funkčních programech jednou definované proměnné nemění svou hodnotu v průběhu programu. Funkční programy nemají příkazy přiřazení. Pokud musíme uložit nějakou hodnotu, definujeme místo toho nové proměnné. To eliminuje jakékoli šance na vedlejší účinky, protože jakákoli proměnná může být nahrazena její skutečnou hodnotou v kterémkoli okamžiku provádění. Stav libovolné proměnné je v každém okamžiku konstantní.

Příklad:



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

Funkce jsou prvotřídní a mohou být vyššího řádu: S funkcemi první třídy se zachází jako s proměnnými první třídy. Proměnné první třídy mohou být předány funkcím jako parametr, mohou být vráceny z funkcí nebo uloženy v datových strukturách. Funkce vyššího řádu jsou funkce, které berou jiné funkce jako argumenty a mohou také vracet funkce.

arraylist seřazený java

Příklad:

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>

Proměnné jsou neměnné: Ve funkcionálním programování nemůžeme měnit proměnnou poté, co byla inicializována. Můžeme vytvářet nové proměnné – ale nemůžeme upravovat existující proměnné, a to opravdu pomáhá udržovat stav po celou dobu běhu programu. Jakmile vytvoříme proměnnou a nastavíme její hodnotu, můžeme se plně spolehnout na to, že hodnota této proměnné se nikdy nezmění.

Výhody a nevýhody funkcionálního programování

výhody:

  1. Čisté funkce jsou snáze pochopitelné, protože nemění žádné stavy a závisí pouze na vstupu, který jim byl poskytnut. Jakýkoli výstup, který produkují, je návratovou hodnotou, kterou dávají. Jejich podpis funkce poskytuje všechny informace o nich, tj. jejich návratový typ a jejich argumenty.
  2. Schopnost funkcionálních programovacích jazyků zacházet s funkcemi jako s hodnotami a předávat je funkcím jako parametry činí kód čitelnějším a srozumitelnějším.
  3. Testování a ladění je jednodušší. Protože čisté funkce berou pouze argumenty a produkují výstup, neprodukují žádné změny, neberou vstup ani nevytvářejí nějaký skrytý výstup. Používají neměnné hodnoty, takže je snazší zkontrolovat některé problémy v programech napsaných pomocí čistých funkcí.
  4. Používá se k implementaci souběžnosti/paralelnosti, protože čisté funkce nemění proměnné ani žádná jiná data mimo ně.
  5. Přijímá líné vyhodnocování, které zabraňuje opakovanému vyhodnocování, protože hodnota je vyhodnocena a uložena pouze tehdy, když je potřeba.

Nevýhody:

  1. Někdy může psaní čistých funkcí snížit čitelnost kódu.
  2. Psaní programů v rekurzivním stylu namísto použití smyček může být trochu zastrašující.
  3. Psaní čistých funkcí je snadné, ale zkombinovat je se zbytkem aplikací a I/O operacemi je obtížný úkol.
  4. Neměnné hodnoty a rekurze mohou vést ke snížení výkonu.

Aplikace:

  • Používá se v matematických výpočtech.
  • Je potřeba tam, kde je vyžadována souběžnost nebo paralelismus.

Skutečnost: Whatsapp potřebuje pro svých 900 milionů pouze 50 inženýrů uživatelů protože Erlang se používá k implementaci svých potřeb souběžnosti. Facebook používá Haskell ve svém antispamovém systému.