Funkcionální programování: Porovnání verzí

Smazaný obsah Přidaný obsah
m přidání odkazu
napřímení odkazů
Řádek 6:
Výpočtem funkcionálního programu je tedy posloupnost vzájemně ekvivalentních výrazů, které se postupně zjednodušují. Výsledkem výpočtu, pokud se k němu podaří dospět, je výraz v dále nezjednodušitelné ''normální formě''. Program je chápán jako jedna funkce obsahující vstupní parametry mající jediný výstup. Tato funkce pak může být dále rozložitelná na podfunkce.
 
V praxi je rozdíl mezi matematickou funkcí a představou funkce použité v [[Imperativní programování|imperativním programování]]. [[Turingův stroj#Subrutiny|Imperativní funkce]] mohou mít [[Vedlejší účinek (programování)|vedlejší účinky]], které mění stav programu. Z toho důvodu postrádají [[referenční transparentnost]]: Stejné volání může vést k  různým návratovým hodnotám v  závislosti na stavu vykonávaného programu. Oproti tomu ve funkcionálním kódu návratové hodnoty funkcí záleží pouze na argumentech funkce, a tudíž dvě volání téže funkce se stejnými argumenty vrací vždy stejnou hodnotu. Eliminace vedlejších účinků může zjednodušit analýzu a pochopení chodu programu, což je jednou z  klíčových motivací pro vývoj funkčního programování.
 
V praxi se můžeme setkat jak s [[čistě funkcionální]]mi jazyky, které striktně vycházejí z teorie (např. FP, Haskell, Miranda, Hope), tak i s hybridními jazyky, které mohou obsahovat i prvky, které jsou v rozporu se základními principy funkcionálního programování. Například často citovaný „typicky“ funkcionální jazyk [[Lisp]] je ve skutečnosti jazykem hybridním, neboť umožňuje modifikovat hodnoty již definovaných proměnných. Mezi hybridní jazyky patří rovněž jazyky [[Standard ML]], [[Scheme]], či [[F Sharp|F#]]. Dále lze funkcionální jazyky dělit dle [[Typová kontrola|typové kontroly]] na ''typované'' ([[Haskell (programovací jazyk)|Haskell]], [[F Sharp|F#]], [[Scala (programovací jazyk)|Scala]], [[OCaml]]) a ''netypované'' ([[Lisp]], [[Scheme]]).
Řádek 37:
 
=== Čistě funkcionální ===
[[Čistě funkcionální]] programy nemají žádné vedlejší efektyúčinky. To činí jejich chování jednodušším na pochopení a naprogramování. Například výsledek použití čisté funkce na čistý argument nezávisí na pořadí vyhodnocení. V důsledku jazyk, který nemá žádné nečisté funkce (čistě funkcionální jako například [[Haskell (programovací jazyk)|Haskell]]), může použít [[evaluace (programování)|evaluaci]] call-by-need. Nicméně ne všechny funkcionální jazyky jsou čisté. Jazyky z rodiny Lispu nejsou čisté, protože způsobují vedlejší efektyúčinky.
 
Jelikož čisté funkce neupravují sdílené proměnné, může jich být paralelně sdíleno více, aniž by se navzájem ovlivňovaly. Čisté funkce jsou proto [[vláknově bezpečné]], a to umožňuje interpretům a kompilátorům používat evaluaci call-by-future.
Řádek 52:
a eliminuje druhé vyhodnocení (pravděpodobně zbytečného volání funkce f(x)). Tato optimalizace se nazývá eliminace společného podvýrazu (common subexpression elimination).
 
Nicméně jestliže má funkce vedlejší efektúčinek, volání funkce nemůže být eliminováno. Podívejte se na následující program:
 
y = random() * random();
Řádek 95:
 
== Porovnání funkcionálního a imperativního programování ==
Funkcionální programování je velmi odlišné od imperativního programování. Nejvýraznější rozdíl je v tom, že funkcionální programování zabraňuje vedlejším efektům, které jsou používané v imperativním programování k implementování stavů vstupů a výstupů. [[Čistě funkcionální]] programování zakazuje vedlejší efektyúčinky. Zakázání vedlejších efektů zajišťuje referenční průhlednost, která ulehčuje verifikaci, optimalizaci a paralelizaci programů a ulehčuje psaní automatických nástrojů k provedení těchto procesů.
 
Higher-order funkce jsou zřídka používány ve starších imperativních jazycích. Kde by tradiční imperativní programování nejspíše použilo smyčku k prozkoumání seznamu, funkcionální styl by často použil higher-order funkci mapování, která převezme jako argument funkci a seznam, aplikuje funkci na každý element seznamu a vrátí seznam výsledků.
 
=== Simulování stavu ===
Některé úlohy se zdají být většinou implementovány pomocí stavu. [[Čistě funkcionální]] programování provádí tyto úlohy a vstupně výstupní úlohy (jako je třeba přijmutí uživatelského vstupu a výstup na obrazovku) jinou cestou. Čistě funkcionální jazyk, jako je Haskell, je implementuje za použití [[monáda (funkcionální programování)|monád]], pocházejících z [[teorie kategorií]]. Monády jsou extrémně silný nástroj a nabízí intuitivní cestu jak modelovat [[Status (počítač)|stav]] (a jiné [[vedlejší efekt]]yúčinky jako například vstupy a výstupy) v imperativním stylu bez ztráty čistoty. Zatímco existující monády jsou jednoduché na použití, pro spoustu lidí je těžké definovat novou monádu (která je občas potřebná pro určité typy knihoven). Alternativní metody jako třeba <s>[[Hoareho logika]] a</s> [[unikátnost]] byly vytvořeny pro sledování vedlejších efektů v programu. Některé moderní vývojové jazyky používají systém efektů k jednoznačnému zjištění vedlejších efektů.
 
=== Záležitosti efektivity ===
Řádek 143:
* [[Deklarativní programování]]
* [[Logické programování]]
* [[Vedlejší účinek (programování)]]
 
== Externí odkazy ==