Please enable JavaScript.
Coggle requires JavaScript to display documents.
19. Funkcionální programování (Funkcionální programovací paradigma…
19. Funkcionální programování
Funkce vyšších řádů a jejich využití
př.: map:: (a->b)->[a]->[b]
min 2 argumenty - lze chápat jako vyššího řádu
jako parametr má jinou fci / fci vrací jako návratovou hodnotu
př.: max 4 5 -> (max 4) 5
umožňuje částečnou aplikaci
zabránění částečné aplikace - musíme předat víc argumentů najednou - uspořádaná n-tice
částečná aplikace
můžeme ji uložit do proměnné a poté jí dát poslední param
př.: násobení
zavoláme funkci, která bere 3 param. a předložíme jen 2
více param - vždy zleva
problém: nelze částečně apl. na jiný param.
řešení: flip
argumenty apl. v opačném pořadí - modifikátor fce
aplikace fce na n argumentů je vlastně apliakce celé fce na 1 argument
Funkcionální programovací paradigma
redukční krok
úprava výrazu, v němž se nějaký jeho podvýraz nahradí zjednodušeným podvýrazem
1 krok zjednodušení výrazu
redukční strategie a jejich vlastnosti
pravidlo, určuje, jaký podvýraz se bude upravoavt v násl. redukčním kroku - redukovat jako 1.
striktní
nejdříve argumenty fcí (1
*
)
F X... nejprve X, nakonec celý výraz
zevnitř
zacyklení - nejméně bezpečená (nezacyklí se - nikdy)
př.: Lisp
každý argument jen jednou!
určuje způsob vyhodnocení výrazu
normální
zvnějšku
nezacyklí se, pokud nemusí (pokud je možné redukovat, redukuje se) - nejbezpečenější (zacyklí se - vždy)
podvýrazem je celý výraz, nejdříve F, pak F X
ne nutně nejkratší
argumenty pořád dokola
líná
jako normální, ale pamatuje si hodnoty podvýrazů
argumenty max jednou
Haskell
umožňuje nek. struktury
nelze: výrazy s vedlejším efektem
líná / normální - vyhodnocení až když je potřeba --> nek. strukturz
princip výpočtu
příklady
deklarativní
programování pomocí definic - CO ne jak
program = funkce - vstup + výstup (podfunkce)
jednoduchost, čitelnost, elegance
návratové hodnoty fcí záelží pouze na argumentech
styl tvorby programu, hlavní metoda je práce s funkcemi a jejich apliakce na argumenty
2 volání = fce vrátí VŽDY = hodnotu - nikdy neměnís tav programu
tzn. zjednodušuje analýzu
rysy funkcionálních jazyků
bohatý typový systém a silná typová kontrola (rychlá detekce chyb, snadné ladění)
deklarativnost (krátké, čitelné, jednoduché, bez impl. detailů)
nezávislost (se všemi hodnotami se pracuje stejně, jednoduchá synt. a sém.)
funkcionální programy
výraz = konstanty, proměnné, fce, lokální definice
program = 1 výraz
výraz = stavební prvek
funkce, konstanty = definice
Lambda funkce
(\x -> x
x + x
x) 3
lze i pojmenovat: f = (\x -> x*x)
jednoduché, jednorázové
map (\x -> x*x) [1,2,3] -> [1,4,9]
nepojmenovaná fce, anonymní
lambda fce vyšších řádů - vnořené
obvykle - předání fci vyššího řádu
Schopnost elementárního programování v Haskellu
lokální definice: let/where
rekurze, zastavující klauzule
vlevo: definice fce + parametry, vpravo - výsledek vyhodnocení po 1 kroku
fce: odd, even, div, mod, const, id, flip
definice fcí - základ
datové typy: Integer, Int, Bool, Float, Char, String
uspořádané n-tice
seznamy
vkládá se na začátek (:)
spojování (++)
operace: head, tail, length, fce: map, filter, take, drop, repeat, replicate, zip,...
výběr prvku (!!)
skládání fcí
curry, flip, map
foldl, foldr
funkcionální jazyky: Haskell, Lisp, Scheme
pojmy
zápis
prefix (vyšší priorita)
infix
operátor (div, moc, +,...)
redukce