1.3. Proč studovat funkcionální programování

Funkcionální programování je poněkud zvláštní programátorskou disciplínou. Vzhledem k tomu, že se v praxi setkáváme především s imperativními jazyky, mohlo by se studium funkcionálních jazyků zdát zbytečné. Ovšem i v případě, že si na své živobytí budete s velkou pravděpodobností vydělávat spíše jinými prostředky, má toto studium své opodstatnění.

Funkcionální jazyky poskytují mnohem lepší možnosti abstrakce než klasické imperativní jazyky. Kromě abstrakce dat totiž umožňují abstrahovat i chování, tj. celé algoritmy. Například počítáme-li součet řady čísel, začneme číslem 0 a postupně k němu přičítáme jednotlivé členy řady. Pokud počítáme součin takové řady, začneme číslem 1 a postupně provádíme násobení se všemi členy. Tyto dva výpočty můžeme abstrahovat do jediné operace, jejímiž parametry jsou kromě nějaké řady čísel také počáteční hodnota a operace, kterou máme se všemi členy řady provést. Tuto abstraktní operaci pak můžeme zařadit do knihovny operací a opakovaně využít i v dalších situacích, čímž zkrátíme a zpřehledníme zápis programu.

Referenční transparence má ještě jeden zajímavý důsledek. Vzhledem k tomu, že výsledek funkce může záviset pouze na hodnotách jejích argumentů (funkce nemohou mít vedlejší účinky), můžeme velmi jednoduše výpočet paralelizovat. Například máme-li vyhodnotit součet výsledků volání dvou funkcí, můžeme výpočet obou funkcí spustit paralelně a po dokončení obou paralelních větví pouze sečíst výsledky. Uvědomte si, že toto nemůžeme jednoduše provést v imperativních jazycích, kde například přiřazení do globální proměnné v jedné funkci by mohlo ovlivnit výpočet druhé funkce, pokud by s touto globální proměnnou také pracovala. Spíš u funkcionálních programů narážíme na opačný problém, neboť díky těmto vlastnostem je potenciálně paralelizovatelných výpočtů příliš mnoho a je třeba hledat takový rozklad programu, při kterém režie paralelního výpočtu nespotřebuje nebo dokonce nepřesáhne to, co paralelním výpočtem získáme.

S funkcionálními programy se lépe pracuje, pokud je chceme nějakým způsobem transformovat, optimalizovat nebo například formálně dokázat jejich správnost. Podstatnou vlastností funkcionálních programů je referenční transparence; ta zajistí, že v daném kontextu představuje proměnná vždy tutéž hodnotu. Uvědomte si, že tuto vlastnost imperativní programy nemají - provedeme-li přiřazení do proměnné, může proměnná svoji hodnotu změnit, což podstatně ztěžuje jakékoliv symbolické manipulace s programy. Funkcionálnímu programování se také někdy říká „programování bez přiřazení“, neboť v čistě funkcionálních programech operace přiřazení do proměnné neexistuje a pojem proměnná je v těchto jazycích shodný s matematickým pojetím proměnné jako neznámé, ale konkrétní hodnoty.

Proti imperativním programům založeným na vyhodnocování všech argumentů funkce před jejím voláním, umožňují funkcionální jazyky mnohem volnější přístup, tzv. líné vyhodnocení. Při něm se nechávají parametry funkce nevyhodnocené až do okamžiku, kdy je jejich hodnota ve výpočtu přímo použita. To umožňuje například pracovat s potenciálně nekonečnými datovými strukturami, které se při výpočtu programu postupně vytvářejí jen v té velikosti, se kterou program skutečně pracuje. Například můžeme výpočet prvních 100 prvočísel naprogramovat mnohem jednodušeji, pokud vytvoříme funkci vracející potenciálně seznam všech prvočísel, a z tohoto seznamu pak vezmeme prvních 100 prvků. Mechanismus líného vyhodnocení zajistí, že se skutečně bude hledat jen těchto prvních 100 prvků, aniž bychom museli algoritmus komplikovat testy na počet již vygenerovaných hodnot.

Funkcionální programování je samo o sobě důležité pro některé oblasti informatiky jako je umělá inteligence, formální specifikace a modelování nebo rychlé prototypování. Mnoho myšlenek, které dnes tvoří teoretický základ našeho oboru, vzniklo právě jako důsledek experimentů s funkcemi a jejich vlastnostmi. Tento přístup přinesl například metody pro popis sémantiky programovacích jazyků (denotační sémantika), případně umožnil vznik základních pouček teorie složitosti algoritmů a vyčíslitelnosti.

A konečně nesmíme také zapomínat na jednu vlastnost, která funkcionální jazyky přivedla až do prvních ročníků některých univerzit jako první programovací jazyk, se kterým se studenti za dobu svého studia prakticky seznámí. Z pohledu studenta informatiky je funkcionální programování zajímavou a myšlení rozvíjející činností, která umožňuje jiný pohled na programování. Mnoho algoritmů má ve funkcionálních jazycích velmi elegantní vyjádření, které vystihuje podstatu algoritmu a neruší mnoha implementačními detaily, jimiž se musíme jinak zabývat. To umožňuje hlubší proniknutí do podstaty některých algoritmů i ocenění jejich elegance a matematické čistoty.