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

Smazaný obsah Přidaný obsah
opravena definice cyrryingu
JAnDbot (diskuse | příspěvky)
m Robot: přidáno {{Autoritní data}}; kosmetické úpravy
Řádek 4:
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_strojTuringův stroj#Subrutiny|Imperativní funkce]] mohou mít [[Vedlejší účinek|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ěčistě funkcionální|čistě funkcionálními]]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]]).
 
== Použití ==
 
Funkcionální [[Programovacíprogramovací jazyk|programovací jazyky]]y, především [[čistě funkcionální]], se používají spíše v akademickém než komerčním prostředí. Přesto široké spektrum organizací využívá některé funkcionální programovací jazyky jako např. [[Erlang (programovací jazyk)|Erlang]], [[R (programovací jazyk)|R]] ([[statistika]]), [[Mathematica]] (symbolická matematika), [[Haskell (programovací jazyk)|Haskell]], ML, J a K ([[finanční analýza]]) a doménově specifické programovací jazyky jako XQuery/[[XSLT]] ([[Extensible Markup Language|XML]]). Dále jsou funkcionální programovací jazyky důležité pro některá odvětví informatiky, například zabývající se umělou inteligencí, formální specifikací, modelováním nebo rychlým prototypováním.
 
== Historie ==
Řádek 93:
Striktní vyhodnocení je efektivnější. Ve striktním výpočtu je argument počítán jednou, zatímco v "blbě implementovaném" nestriktním může být počítán vícekrát, jak můžete vidět v příkladu nahoře, kde je funkce g vypočítána vícekrát. Striktní výpočet je také jednodušší implementovat, pokud argumenty předané datové funkci jsou datové hodnoty, v nestriktním výpočtu mohou být argumenty výrazy. A ve výsledku první funkcionální jazyky jako [[LISP]], [[ISWIM]] a [[ML (programovací jazyk)|ML]] spolu s hodně novými funkcionálními jazyky používají striktní výpočet.
 
Nicméně jsou tu důvody preferovat nestriktní výpočet. Lambda kalkul poskytuje silnější teoretické základy pro jazyky, které používají nestriktní výpočet. Nestriktní výpočet používají nejvíce definiční jazyky. Například podporuje nekonečné datové struktury jako seznam všech kladných proměnných typu integer nebo všech prvočísel. S nestriktním výpočtem jsou tyto struktury vypočítány pouze v kontextu, kde je vyžadována konečná délka. To vedlo k vývoji líného výpočtu, což je typ nestriktního výpočtu, kde výsledek počátečního výpočtu kteréhokoliv argumentu může být sdílen přes výpočtovou sekvenci. Ve výsledku není argument spočítán nikdy více než jednou. Líný výpočet je používán hlavně línými moderními [[Čistěčistě funkcionální|čistě funkcionálními]]mi jazyky jako je [[Miranda (programovací jazyk)|Miranda]], [[Clean]] a [[Haskell (programovací jazyk)|Haskell]].
 
=== Funkcionální programování v nefunkcionálních jazycích ===
Řádek 105:
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ů.
 
Zatím ani slovo o anonymních funkcích, tzv. lambda funkcích.
 
=== Simulování stavu ===
Řádek 158:
 
{{Pahýl}}
{{Autoritní data}}
 
[[Kategorie:Paradigmata programování]]