Seminář z funkcionálního programování
Seminář z funkcionálního programování
Kapitola obsahuje:
1
Studijní text
Učitel doporučuje studovat od 14. 2. 2022 do 6. 3. 2022.
Kapitola obsahuje:
7
Odpovědník
24
PDF
4
Studijní materiály
6
Video
1
Studijní text
17
Web
Učitel doporučuje studovat od 14. 2. 2022 do 15. 5. 2022.

Kapitola obsahuje:
1
Diskusní fórum
1
Odevzdávárna
1
PDF
1
Studijní materiály
1
Studijní text
Učitel doporučuje studovat od 23. 3. 2022 do 24. 4. 2022.
Domácí úkol 2 – zrušen
Učitel doporučuje studovat od 18. 4. 2022 do 3. 5. 2022.

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í

Čerstvost materiálů
Některé materiály se mohou před cvikem mírně měnit či prohazovat.

Cvičení 1

Pokročilá syntaxe, Either, funktory

Hoogle (Haskell API search)
Vyhledávač funkcí a modulů podle názvu, typu, popisu
Learn You a Haskell for Great Good!
Výtečná učebnice Haskellu od základů až po monády

Cvičení 2

Monády, aplikativní funktory

Snadno stravitelné články k pochopení monád:

Cvičení 3

Parsec

První velký domácí úkol

Parser. Informace jsou v samostatné podosnově.

Cvičení 4

QuickCheck

Přednáška: QuickCheck
Může být zapotřebí video otevřít mimo prohlížeč (kodek H.265)

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

[Zrušeno] Druhý velký domácí úkol

Informace jsou v samostatné podosnově. Úkol byl letos zrušen.

Cvičení 9

Čočky (lenses) a jiná optika

Příklad: hra Pong
Vcelku hezký a čitelný příklad použití čoček ve stavové monádě (operátory +=, %= atd.)

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.
Domácí úkol 2 – zrušen

Domácí úkol 2 – zrušen

Obsah není zveřejněný.