Máte zapnutý náhled celé osnovy, zpět na běžné zobrazení.
Načítání a prohlížení osnovy může být v závislosti na množství obsahu pomalejší.
Organisace a pravidla absolvování
ZMĚNA: druhý úkol byl letos zrušen.
TL;DR: Je potřeba udělat dvě domácí úlohy s peer review a k tomu 5/7 cvikových miniúloh s neomezeným odevzdáváním do konce května.
Organisace kursu
Tento kurs se zabývá programováním ve funkcionálním jazyce Haskell, a to především z praktického hlediska. Je organisován jako série „cvikopřednášek“ v B130 s týdenní periodicitou. První část je obvykle přednáškovitější, druhá spíše samostatné programování. Přítomnost na semináři není povinná; je na zvážení každého, zda zvládne splnit podmínky čistě na základě samostudia.
Kurs probíhá presenčně, k disposici máte ale pro případ nutnosti také předtočené přednášky z předcházejících běhů předmětu. Jen mějte na paměti, že jak se seminář vyvíjí, může se obsah cvik mírně odchýlit od předtočené verse. Také samozřejmě ignorujte organisační pokyny ve videích – týkají se starého semestru.
Studijní materiály jsou naplněny loňskými versemi slajdů; před samotným cvikem se mohou mírně měnit.
Úlohy a bodování
Během semestru budou zadávány dva typy úloh, které se budou lišit rozsahem, bodováním i způsobem hodnocení. Navíc k větším úlohám budete psát stručnou zpětnou vazbu svým kolegům.
Miniúlohy
Tyto drobné úložky (či spíše příklady) slouží k vyzkoušení/procvičení obsahu jedné přednášky a slouží vlastně jako automatické testy pro práci na cviku.
- Počet: 7 za semestr (tj. ne každé cvičení bude mít přiřazenu miniúlohu).
- Forma: Odpovědník s jedním až třemi políčky pro implementaci funkce/instance/výrazu.
- Odevzdání: Neomezeně mnohokrát a kdykoli do konce května.
- Rozsah a náročnost: Přibližně kolem hodiny (při úplném pochopení přednášky tak 15 minut).
- Další požadavky: Typicky budou předepsány techniky ze cvičení, jimiž se má úkol řešit.
- Kontrola: Odpovědníky jsou navázány na automatické testy, jejichž výsledky máte k disposici. Po úspěšných testech řešení zkontroluje ještě vyučující, zda používá předepsané techniky, a případně může dát drobnou zpětnou vazbu. Kontrola vyučujícím bude probíhat pravidelně. Předpokládá se, že tyto úlohy budeme řešit rovnou na cviku a zpětnou vazbu dostanete tamtéž.
- Bodování: Binární (0 nebo 1); zadává vyučující po kontrole.
- Zveřejnění: Studentská ani vzorová řešení nejsou veřejná.
Větší domácí úlohy
Tyto úkoly slouží k tomu, abyste si vyzkoušeli napsat delší kód v Haskellu.
- Počet: 2 za semestr (ve 3. a 8. týdnu).
- Forma: Jeden soubor vložený do odevzdávárny.
- Odevzdání: Neomezeně mnohokrát, do tří týdnů od zadání.
- Rozsah a náročnost: Přibližně 300 řádků kódu, práce na jednotky hodin (nejvýše víkend :-)).
- Další požadavky: Kód by měl být přeložitelný s přepínačem -Wall bez varování a měl by mít čistý výstup HLintu. Pokud se rozhodnete doporučení HLintu nedodržet, stručně to v komentáři zdůvodněte.
- Kontrola: Soubory v odevzdávárně se pravidelně kontrolují automatickými testy, jejichž výsledky uvidíte v poznámkovém bloku. Po konci odevzdávání kód prohlédne ještě vyučující, který kromě bodů napíše i zpětnou vazbu.
- Bodování: Diskrétní: 0, 1, 3 nebo 4 body podle funkčnosti (primárně), ale také efektivity, elegance a stylu řešení. (Pro zisk jednoho bodu stačí úlohu úplně neodfláknout. :-))
- Zveřejnění: Řešení všech studentů jsou po konci odevzdávání zveřejněna všem studentům předmětu.
Peer review
Kromě psaní kódu je důležité i jeho čtení a pochopení; u větších úloh proto chceme, abyste si kódy navzájem četli a hodnotili.
- Počet: 2×2 za semestr – dvě cizí řešení po skončení každé větší úlohy.
- Forma: Vepisování komentářů přímo do kódu.
- Odevzdání: Týden po konci odevzdávání.
- Rozsah: Ke každému řešení alespoň tři odstavce textu či odrážek:
- Co nefunguje (chová se v rozporu se zadáním) a proč?
- Co se vám líbí? (Které myšlenky řešení se vám zdají elegantní či nadprůměrně dobré a proč?)
- Co byste udělali jinak? (Které myšlenky či části kódu se vám zdají matoucí, nevhodné nebo byste je udělali jinak?)
- Kontrola: Vyučující po konci vyplňování ověří, že review má dostatečný rozsah a přínosnost (tj. zda to není odfláknuté :-)).
- Bodování: Binární (přijato/nepřijato); zadává vyučující po kontrole.
- Zveřejnění: Zpětná vazba od všech hodnotitelů i vyučujícího jsou po konci peer review zveřejněna všem studentům předmětu.
Podmínky získání zápočtu
Pro úspěšné absolvování kursu je zapotřebí splnit následující čtyři podmínky:
- Mít splněno alespoň pět ze sedmi miniúloh.
- Mít obě velké úlohy splněny na nenulový počet bodů.
- Mít za velké úlohy alespoň čtyři body z osmi.
- Poskytnout zpětnou vazbu všem čtyřem cizím řešením.
Materiály ze cvičení
Cvičení 1
Pokročilá syntaxe, Either, funktory
Cvičení 2
Monády, aplikativní funktory
Snadno stravitelné články k pochopení monád:
Cvičení 3
Parsec
Parser. Informace jsou v samostatné podosnově.
Cvičení 4
QuickCheck
Cvičení 5
Vyhodnocovací strategie
Cvičení 6
Semigroup, Monoid, Foldable, Traversable
Cvičení 7
Reader, Writer, State
Cvičení 8
Pokročilejší I/O, výjimky
Informace jsou v samostatné podosnově. Úkol byl letos zrušen.
Cvičení 9
Čočky (lenses) a jiná optika
Cvičení 10
Zippers, řetězce, rozšíření GHC
Cvičení 11
Transformátory monád (ReaderT, WriterT, StateT, ExceptT)
Cvičení 12
Ještě mnohem temnější magie
TODO: cviko
Dodatečné materiály
Domácí úkol 1
Implementační část
- Úkol: Pomocí knihovny Parsec implementujte parser podmnožiny argumentů nástroje GNU find.
- Termín: Neděle 17. dubna 2022 23.59
- Formát: Odevzdáváte jeden soubor HW01.hs, který vznikne doimplementováním parseru do poskytnuté kostry modulu. Odevzdávárna nahrávané soubory automaticky prefixuje vaším jménem. Odevzdávat můžete opakovaně, ale ujistěte se, že v odevzdávárně nezůstávají stará řešení. Nad každým odevzdáním budou spuštěny automatické testy, jejichž výsledek uvidíte v poznámkovém bloku.
Část peer review
- Úkol: Napište dvě recenze na dvě řešení vašich spolužáků.
- Termín: Neděle 24. 4. 2022 23:59
- Formát: Komentáře vkládané do recensovaného řešení. Přidělené řešení získáte (a okomentované odevzdáte) nástrojem na Aise – technické podrobnosti budou sděleny později.
Příklad peer review
Následující příklady zpětné vazby se týkají různých více či méně hypotetických úkolů a můžete se jimi inspirovat. Pochází ale z doby, kdy se recenze psaly do tří textových políček. Nyní budete komentáře vepisovat přímo do kódu, takže nebudete muset pracně popisovat, kterou funkci nebo řádku máte zrovna na mysli.
Co nefunguje?
- Když zadám více přepínačů --help, program spadne na neúplné vzory (asi by stačilo na ř. 42 nepokračovat rekurzívním voláním).
- Nefunguje správně redefinice proměnných: když je na vstupu "foo=x" a pak "foo=y", měla by být hodnota "y", ale Tvé řešení je spojí do "xy". Je to asi copy-paste chybou na ř. 101, kde už nemá být <>.
- Vyhodnocování "Let" nepracuje správně s platností lokálních proměnných. Např. při "eval $ Let 'x' (Con 42) (Let 'x' (Con 66) (Var 'x'))" má být výsledek 66, ale ty vracíš 42.
- Pokud program dostane "--verbose --silent", všímá si jen toho prvního a je ukecaný. Není to chyba, protože takový případ zadání nespecifikovalo, ale obvyklejší praxe je buď oznámit chybu, nebo z konfliktních přepínačů brát vždy ten poslední.
- Nepovedlo se mi na žádném divném vstupu řešení rozbít; dobrá práce.
Co se vám líbí?
- Zajímavé řešení přes vlastní fold na AST.
- Dobrá dekomposice; ani by mě nenapadlo, že se dají funkce "foo" a "bar" takhle zobecnit.
- Moc pěkné a účelné použití PatternGuards.
- Líbí se mi, jak obratně používáš různé monadické funkce (liftM3, join, <*).
- Oceňuji komentář u funkce "subeval", s ním byl kód jasný. Na druhou stranu ostatní komentáře by snad ani potřeba nebyly, ten kód je fakt dobře čitelný.
Co byste udělali jinak?
- HLint má několik připomínek, až na zbytečné závorky s nimi souhlasím.
- Předávání stavu jako pětice je nepřehledné, zvážil bych použít vlastní record.
- Místy (zejm. f-ce "loremIpsum") už je těch monadických operátorů a závorek na jednom řádku moc a špatně se mi sledovalo, co se vlastně děje. Osobně bych části složitějších výrazů vytáhl do lokální definice, protože mi to umožní jim dát jméno a lépe se pak čte, co se děje o úroveň výš.
- Většina rekurzívních funkcí nad Expr vypadá podobně; uvažoval bych nad foldem.
- Řešit "dolorSitAmet" seznamovou monádou mi připadá matoucí, protože to nevnímám jako přirozeně nedeterministický výpočet, ale prostou seznamovou funkci.