Seminář z funkcionálního programování

Domácí úkol 1

Implementační část

  • Úkol: Pomocí knihovny Parsec implementujte parser formátu JSON dle specifikace.
  • Termín: 5. 4. 2020 23.59
  • Formát: Odevzdáváte 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 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.

Chyba: Odkazovaný objekt neexistuje nebo nemáte právo jej číst.
https://is.muni.cz/el/fi/jaro2020/IB016/um/homework/hw01/HW01.pdf

Chyba: Odkazovaný objekt neexistuje nebo nemáte právo jej číst.
https://is.muni.cz/el/fi/jaro2020/IB016/um/homework/hw01/HW01.hs

Domácí úloha 1
Odevzdávejte pouze jeden soubor!

Část peer review

  • Úkol: Vaším úkolem je pochopit a otestovat řešení dvou dalších studentů. Řešení vám přidělí IS po termínu odevzdání. K vylosovaným řešením napište zpětnou vazbu. Ta obsahuje následující 3 odstavce textu/odrážek:
    • Co nefunguje? (Pro které případy se řešení chová v rozporu se zadáním 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: 12. 4. 2020 23.59
Chyba: Odkazovaný objekt neexistuje nebo nemáte právo jej číst.
https://is.muni.cz/el/fi/jaro2020/IB016/um/homework/hw01/feedbax.html

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.

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.