NPRG068 Programování v Haskellu
ZS 2021/22, 2/0 Zk, 3 kredity
Distanční výuka
Forma výuky je prozatím prezenční, je ale možné, že formát semestru se přepne do distančního.
- Zoom meeting ID: dostanete mailem, případně bude v SISu na nástěnce
- PARG Mattermost, tým 2021ZS, kanál #nprg068-haskell (invite link bude v SISu na nástěnce)
Požadavky
- V průběhu semestru budou zadány 3 domácí úkoly (doba na vypracování každého bude cca měsíc). Kvalita a množství odevzdaných úkolů bude centrální pro výsledné hodnocení.
- Zkouška bude pokrývat obecné funkcionální a Haskellové programovací techniky používané v nejznámějších knihovnách; je myšlená spíše jako doplnění případných nedostatků v domácích úkolech.
Přesná pravidla a termíny budou oznámeny na první přednášce a zaznamenány ve slajdech.
Slajdy
PDF
Slajdy budou průběžně (bez varování) doplňovány.
Nějaké kusy zdrojového kódu ze slajdů na hraní jdou najít tady.
Průběh přednášek
- 1 (30.9.)
- Úvod do funkcionálního programování, syntax Haskellu, typy, Curry-style funkce, typové třídy, funktory. (ve slajdech cca do konce aplikativních funktorů, před první náznaky monád)
- 2 (7.10.)
- Funkce jako kontejnery na výsledky. Typové třídy, monoidy, funktory, aplikativní funktory, motivace pro monády. Tradiční monády pro State, rychlý pohled dovnitř IO. (ve slajdech do konce úvodu, až k velkému středníku)
- 3 (14.10.)
- Parsování pomocí monád (aka parsovací kombinátory). Balíčky a knihovny, cabal.
- 4 (21.10.)
- Klíčové součásti standardní knihovny. Kontejnery, související typové třídy, funkcionální datové struktury.
- 5 (4.11.)
- Lambda kalkulus a tradiční funkcionální triky, typovaný lambda kalkulus, Hindley-Milnerův systém, vnitřnosti GHC. Možná se stihne nástin Curry-Howardovy korespondence.
- 6 (11.11.)
- Funkcionální reference a.k.a. lensy, traversaly, zběžně iso, prism. Funktorová van Laarhovenova konstrukce.
- 7 (18.11.)
- Monádové transformery, užitečné monády ze standardní knihovny.
- 8 (25.11.)
- Stringologie a prettyprinting. Napojení GHC runtime na unix, konkurentní programování, FFI.
- 9 (2.12.)
- Několik metod jak generovat docela dobrou grafiku (Gloss, JuicyPixels, unboxed data). Jak debugovat a rozumně testovat Haskell (QuickCheck), benchmarking (criterion).
- 10 (9.12.)
- Haskell vs. webové technologie (Scotty, Servant, Aeson, databázová API). Rychlý pohled na funkcionální generátory javaskriptu a reaktivní programování.
- 11 (16.12.)
- Funkcionální návrhové vzory pro eDSL, interpretery a kompilátory.
Jedenáctá přednáška je poslední "oficiální", čas alokovaný pro přednášku 6.1.2022 můžeme podle domluvy věnovat něčemu užitečnému, např. diskuzi domácích úkolů nebo detailů některých témat z přednášek. Domluva proběhne na mattermostu.
Domácí úkoly
Zadání budou na GitHubu.
Termíny jsou ve slajdech.
Úkoly odevzdávejte do SISu, způsob odevzdání je popsaný ve slajdech i na GitHubu.
Zkouška
Zkouška bude probíhat jako rychlá kontrola obsahu domácích úkolů, případně jako doplnění chybějících částí. (V optimálním případě nebude potřeba doplňovat nic a zkouška bude velmi krátká.) Kontrolní a doplňující otázky se můžou týkat např. následujících témat:
- Typový systém Haskellu a typy metod základních typových tříd v Prelude, otázky podobné následujícím:
- Jaký typ má (.).(.).(.)?
- Jaký typ má fmap fmap.fmap?
- Jaký typ má mappend.mconcat?
- Jaký typ má liftA2 (<>)?
- Jaký druh (kind) má MaybeT?
- Programování s funkcemi vyšších řádů a nekonečnými strukturami:
- Použití Reader funktoru a monády (instance Monad ((->) p))
- Použítí funkcí místo tradičních datových typů (instance Num a => Num (p -> a)).
- Instance seznamu pro Num, Applicative, ...
- Monády a povědomí o tom jak funguje standardní State a IO.
- Mírný přehled o standardních kontejnerech, běžných IO funkcích, fungování Haskellových threadů apod.
- Hrubý přehled o Curry-Howardově korespondenci typů a logiky.
- Fungování a hlavní myšlenky nejpoužívanějších knihoven, např.:
- Parsec
- Transformers
- Lens
- Aeson
- ...
Literatura a užitečné odkazy
Jak začít rychle:
Reference:
Kompletnější materiály:
...