IB016 Seminář z funkcionálního programování
RNDr. Martin Ukrop, Ph.D.
IB016 Seminář z funkcionálního programování
Kapitola obsahuje:
1
Studijní text
Učitel doporučuje studovat od 19. 2. 2018 do 11. 3. 2018.
Kapitola obsahuje:
16
PDF
24
Studijní materiály
1
Studijní text
10
Web
Učitel doporučuje studovat od 19. 2. 2018 do 20. 5. 2018.
Kapitola obsahuje:
1
Diskusní fórum
2
Odevzdávárna
2
Studijní materiály
1
Studijní text
2
Web
Učitel doporučuje studovat od 22. 2. 2018 do 14. 3. 2018.
Kapitola obsahuje:
2
Odevzdávárna
2
Studijní materiály
1
Studijní text
2
Web
Učitel doporučuje studovat od 15. 3. 2018 do 4. 4. 2018.
Kapitola obsahuje:
3
Odevzdávárna
2
Studijní materiály
1
Studijní text
2
Web
Učitel doporučuje studovat od 5. 4. 2018 do 2. 5. 2018.
Kapitola obsahuje:
2
Odevzdávárna
2
Studijní materiály
1
Studijní text
2
Web
Učitel doporučuje studovat od 3. 5. 2018 do 23. 5. 2018.

Organizace a pravidla absolvování

Organizace kurzu

Tento kurz se zabývá programováním ve funkcionálním jazyce Haskell, především z praktického hlediska. Kurz původně vznikl na podnět Pavla Dvořáka a pořád je částečně založen na jeho materiálech. Za inspiraci a materiály z předešlých let děkujeme také Matejovi Kollárovi a Petrovi Pilařovi.

Kurz je organizován jako série dvouhodinových cvičení s týdenní periodicitou (první polovina je obvykle přednáškoidnější, druhá je víc samostatné programování). Cvičení nejsou povinná. Je na zvážení každého, zda dokáže splnit podmínky absolvování kurzu. Očekáváme ale, že si kurz zapíšou zejména studenti se zájmem o probíranou problematiku ;-).

Podmínky úspěšného absolvování kurzu

  • V průběhu semestru budou zadány čtyři domácí úlohy, za které lze získat celkem 52 bodů.
  • Pro udělení zápočtu je nutno dosáhnout alespoň 32 bodů.
  • Každá úloha má programovací část (2 týdny, 10 bodů) a peer-review část (1 týden, 3 body). Pro uznání bodů za daný úkol je nutné mít z obou částí alespoň 1 bod (jinak je úkol hodnocen 0 body).
  • Vypracované řešení (obou částí) se odevzdává do příslušné odevzdávárny v informačním systému. Po uplynutí doby odevzdávání bude zveřejněné možné vzorové řešení a všechna studentská řešení (pouze pro zapsané studenty).
  • Programovací část úlohy je hodnocena hlavně z pohledu funkčnosti, ale zřetel bude brán i na složitost řešení a implementační eleganci. Za velmi pěkné řešení můžete obdržet i nějaký bod navíc; naopak nečitelné, těžkopádné řešení či řešení s nevhodnou složitostí vás může stát i polovinu bodů.
  • Kód musí být kompilovatelný na serveru aisa.fi.muni.cz pomocí ghc-8.0.2 dostupného jako modul (importujte pomocí module add ghc).
  • Vypracovaná programovací část bude kontrolována programem HLint a kompilovaná s přepínačem -Wall. Ani v jednom případě by neměla být vypsaná žádná varování. Můžete se rozhodnout některá doporučení nedodržet, v takovém případě svoje důvody stručně popište do hlavičky odevzdaného souboru.
  • V rámci peer-review části je vaším úkolem pochopit a otestovat řešení dvou dalších studentů dle přidělení od nás. Na základě toho jim napíšete zpětnou vazbu k jejich implementaci. Ta musí obsahovat alespoň následující 3 odstavce textu/odrážek:
    • Co nefunguje? (Pro které případy se řešení nechová správně a proč?)
    • Co se vám líbí? (Které myšlenky řešení nebo části kódu se vám zdají elegantní či nadprůměrně dobré a proč?)
    • Co byste udělali jinak? (Které myšlenky nebo části kódu se vám zdají matoucí, nevhodné, nebo byste je udělali jinak z jiného důvodu?)
  • Po skončení peer-review části bude všechna zpětná vazba (včetně té od nás) zveřejněna (opět jen pro zapsané studenty).

Materiály z cvičení

Upozornění

  • Slidy budeme postupně aktualizovat, stáhněte si před cvičením aktuální verzi.

Cvičení 1

Cvičení 2

  • Poznámka: Na studentském servru aisa je GHC-8.0 dostupné pouze v modulu (stačí spustit module add ghc-8.0.2).

Cvičení 3

Cvičení 4

Cvičení 5

Cvičení 6

Cvičení 7

Cvičení 8

Cvičení 9

Cvičení 10

Cvičení 11

Cvičení 12

Cvičení 13

Na poslední cvičení se pokusíme dovést hosta, který se živí funkcionálním programováním.

Dodatečné materály

Domácí úkol 1

Implementační část

  • Úkol: Implementujte jednoduchý systém pro hodnocení učitelů. Zadání je formou dokumentace požadovaných funkcí vygenerované systémem Haddock.
  • Termín: 7. 3. 2018 23:59
  • Formát: Odevzdejte jeden soubor HW01.hs, který vznikne doimplementováním požadovaných funkcí do poskytnuté kostry modulu. Odevzdávárna nahrávané soubory automaticky prefixuje vaším UČO.

Peer-review část

  • Úkol: Vaším úkolem je pochopit a otestovat řešení dvou dalších studentů dle přidělení v tabulce níže. Na základě toho jim napište zpětnou vazbu k jejich implementaci. Ta musí obsahovat alespoň následující 3 odstavce textu/odrážek:
    • Co nefunguje? (Pro které případy se řešení nechová správně a proč?)
    • Co se vám líbí? (Které myšlenky řešení nebo části kódu se vám zdají elegantní či nadprůměrně dobré a proč?)
    • Co byste udělali jinak? (Které myšlenky nebo části kódu se vám zdají matoucí, nevhodné, nebo byste je udělali jinak z jiného důvodu?)
  • Termín: 14. 3. 2018 23:59
  • Formát: Odevzdejte dva soubory formatu Markdown (textový soubor, nikoliv PDF) s názvem hw01-<prijmeni>.md, kterého jméno identifikuje člověka, kterého kód hodnotíte. Odevzdávárna nahrávané soubory automaticky prefixuje vaším UČO.

Domácí úkol 2

Implementační část

  • Úkol: Implementujte datovou strukturu Trie a napište sadu testů dostatečně pokrývající vaše řešení pomocí knihovny QuickCheck.
  • Termín: 28. 3. 2018 23:59
  • Formát: Odevzdejte jeden soubor HW02.hs, který vznikne doimplementováním požadovaných funkcí do poskytnuté kostry modulu. Odevzdávárna nahrávané soubory automaticky prefixuje vaším UČO.

Peer-review část

  • Úkol: Vaším úkolem je pochopit a otestovat řešení dvou dalších studentů dle přidělení v tabulce níže. Na základě toho jim napište zpětnou vazbu k jejich implementaci. Ta musí obsahovat alespoň následující 3 odstavce textu/odrážek:
    • Co nefunguje? (Pro které případy se řešení nechová správně a proč?)
    • Co se vám líbí? (Které myšlenky řešení nebo části kódu se vám zdají elegantní či nadprůměrně dobré a proč?)
    • Co byste udělali jinak? (Které myšlenky nebo části kódu se vám zdají matoucí, nevhodné, nebo byste je udělali jinak z jiného důvodu?)
    • Krátký závěr/sumář popisující řešení jako celek.
  • Termín: 4. 4. 2018 23:59
  • Formát: Odevzdejte dva soubory formatu Markdown (textový soubor, nikoliv PDF) s názvem hw02-<prijmeni>.md, kterého jméno identifikuje člověka, kterého kód hodnotíte. Odevzdávárna nahrávané soubory automaticky prefixuje vaším UČO.
    Na začátek souboru prosím pište jméno autora kódu i autora peer-review, pomáhá to přehlednosti.

Domácí úkol 3

Implementační část

  • Úkol: Implementujte systém na uklízení databáze seriálů. Zadání je formou popisu problému, dekompozici na jednotlivé funkce si musíte udělat sami. Zadání má dvě části: funkční dekompozici (s typovými signaturami) a samotnou implementaci.
  • Termín:
    • 11. 4. 2018 23:59 pro funkční dekompozici a typové signatury
    • 25. 4. 2018 23:59 pro samotnou implementaci
  • Formát: Odevzdejte jeden soubor HW03.hs, který obsahuje typové signatury funkcí reps. konečnou implementaci. Obě odevzdávárny nahrávané soubory automaticky prefixují vaším UČO.
  • K první části: Odevzdání funkční dekompozice s typovými sigraturami je povinné (a je za něj 1 bod), při složitějších funkcích uvádějte i stručnou dokumentaci, co funkce dělá (klidně odrážkovitě). Při implementaci se samozřejmě nemusíte držet odevzdané funkční dekompozice na 100%, zjistíte-li, že v některém ohledu nebyla vhodná. K funkční dekompozici od nás po odevzdání dostanete krátký feedback.
  • K druhé části: Do hlavičky řešení vložte krátkou reflexi (1 odstavec stačí), jaké pro vás bylo nejdřívě dekomponovat a až pak implementovat. Pište svůj skutečný názor – i pozorování, že podle vás je to kontraproduktivní je v pořádku (máte-li tento názor).

Peer-review část

  • Úkol: Vaším úkolem je pochopit a otestovat řešení dvou dalších studentů dle přidělení v tabulce níže. Na základě toho jim napište zpětnou vazbu k jejich implementaci. Ta musí obsahovat alespoň následující 3 odstavce textu/odrážek:
    • Co nefunguje? (Pro které případy se řešení nechová správně a proč?)
    • Co se vám líbí? (Které myšlenky řešení nebo části kódu se vám zdají elegantní či nadprůměrně dobré a proč?)
    • Co byste udělali jinak? (Které myšlenky nebo části kódu se vám zdají matoucí, nevhodné, nebo byste je udělali jinak z jiného důvodu?)
  • Termín: 2. 5. 2018 23:59
  • Formát: Odevzdejte dva soubory formatu Markdown (textový soubor, nikoliv PDF) s názvem hw03-<prijmeni>.md, kterého jméno identifikuje člověka, kterého kód hodnotíte. Odevzdávárna nahrávané soubory automaticky prefixuje vaším UČO.

Domácí úkol 4

Implementační část

  • Úkol: Implementujte parser pro TODO pomoci knihovny Parsec. Zadání je formou popisu parsovaného formátu, dekompozici na jednotlivé funkce si musíte udělat sami.
  • Termín: 16. 5. 2018 23:59
  • Formát: Odevzdejte jeden soubor HW04.hs, který vznikne doimplementováním požadovaných funkcí do poskytnuté kostry modulu. Odevzdávárna nahrávané soubory automaticky prefixuje vaším UČO.

Peer-review část

  • Úkol: Vaším úkolem je pochopit a otestovat řešení dvou dalších studentů dle přidělení v tabulce níže. Na základě toho jim napište zpětnou vazbu k jejich implementaci. Ta musí obsahovat alespoň následující 3 odstavce textu/odrážek:
    • Co nefunguje? (Pro které případy se řešení nechová správně a proč?)
    • Co se vám líbí? (Které myšlenky řešení nebo části kódu se vám zdají elegantní či nadprůměrně dobré a proč?)
    • Co byste udělali jinak? (Které myšlenky nebo části kódu se vám zdají matoucí, nevhodné, nebo byste je udělali jinak z jiného důvodu?)
  • Termín: 23. 5. 2018 23:59
  • Formát: Odevzdejte dva soubory formatu Markdown (textový soubor, nikoliv PDF) s názvem hw04-<prijmeni>.md, kterého jméno identifikuje člověka, kterého kód hodnotíte. Odevzdávárna nahrávané soubory automaticky prefixuje vaším UČO.