Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

fp:start [2012/10/02 13:57]
petr [Funkcionální programování]
fp:start [2012/10/06 19:26] (aktuální)
petr [Stručně o funkcionálním programování] - Okasaki
Řádek 24: Řádek 24:
 Jeden z cílů funkcionální programování je umožnit co nejvíce specifikovat vlastnosti dané části kódu. Základní vlastností, ke které směřují funkcionální jazyky, je **referenční transparentnost**: výsledek funkce závisí pouze na jejích argumentech. Referenčně transparentní funkce mají velmi blízko k matematickému pojetí funkcí a umožňují velmi přesně analyzovat jejich vlastnosti. V imperativních jazycích se obvykle o této vlastnosti nehovoří, protože funkce běžně zasahují do prostředí programu nebo naopak z něho získávají informace, a tedy nelze jejich chování popsat jen pomocí jejich argumentů. Jeden z cílů funkcionální programování je umožnit co nejvíce specifikovat vlastnosti dané části kódu. Základní vlastností, ke které směřují funkcionální jazyky, je **referenční transparentnost**: výsledek funkce závisí pouze na jejích argumentech. Referenčně transparentní funkce mají velmi blízko k matematickému pojetí funkcí a umožňují velmi přesně analyzovat jejich vlastnosti. V imperativních jazycích se obvykle o této vlastnosti nehovoří, protože funkce běžně zasahují do prostředí programu nebo naopak z něho získávají informace, a tedy nelze jejich chování popsat jen pomocí jejich argumentů.
  
-Snaha o referenční transparentnost vede nevyhnutelně k eliminaci změn stavů. Umožníme-li změny struktur, s kterými program pracuje, bude výsledek funkce pracující s nějakou strukturou záviset na čase, kdy bude zavolána. Nebude referenčně transparentní. Proto jsou obvykle všechny vytvořené **struktury (až na výjimky)((Po pravdě, většina funkcionálních jazyků umožňuje změny stavů. Ale opravdovou krásu nalezne programátor v //čistém// kódu, který je prost změn stavů.)) neměnné**. Možná překvapivě to není velký problém, existuje mnoho (často velmi zajímavých) datových struktur, které jsou optimalizovány na neměnnost.+Snaha o referenční transparentnost vede nevyhnutelně k eliminaci změn stavů. Umožníme-li změny struktur, s kterými program pracuje, bude výsledek funkce pracující s nějakou strukturou záviset na čase, kdy bude zavolána. Nebude referenčně transparentní. Proto jsou obvykle všechny vytvořené **struktury (až na výjimky)((Po pravdě, většina funkcionálních jazyků umožňuje změny stavů. Ale opravdovou krásu nalezne programátor v //čistém// kódu, který je prost změn stavů.)) neměnné**. Možná překvapivě to není velký problém, existuje mnoho (často velmi zajímavých) datových struktur, které jsou optimalizovány na neměnnost. (Doporučuji knihu //Chris Okasaki: Purely Functional Data Structures// - viz. [[fp:poznamky|Literatura]].)
  
 Eliminace změn stavů následně umožňuje //líné vyhodnocování//, tedy vyhodnocování výrazů až tehdy, pokud je jejich výsledek potřeba. To je mocná, i když někdy dvojsečná zbraň. Umožňuje například konstruovat nekonečné datové struktury (kupříkladu. seznam všech prvočísel). Nebo například pokud setřídíme //merge sort// algoritmem seznam, a vyžádáme si pouze první prvek výsledného seznamu, bude složitost tohoto programu pouze //n//, nikoliv //n log n//. Eliminace změn stavů následně umožňuje //líné vyhodnocování//, tedy vyhodnocování výrazů až tehdy, pokud je jejich výsledek potřeba. To je mocná, i když někdy dvojsečná zbraň. Umožňuje například konstruovat nekonečné datové struktury (kupříkladu. seznam všech prvočísel). Nebo například pokud setřídíme //merge sort// algoritmem seznam, a vyžádáme si pouze první prvek výsledného seznamu, bude složitost tohoto programu pouze //n//, nikoliv //n log n//.