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.