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
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ší
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ší
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ší
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é
=== Záležitosti efektivity ===
Řádek 143:
* [[Deklarativní programování]]
* [[Logické programování]]
* [[Vedlejší účinek (programování)]]
== Externí odkazy ==
|