strelec / IPRM-2014

Mathematics with functional programming 2014/15
MIT License
2 stars 0 forks source link

Vmesno poročilo #1

Open andrejbauer opened 9 years ago

andrejbauer commented 9 years ago

Načrt za ta projekt je v redu, bo pa trebe delati, a ne? Že imata časovni načrt? Trenutno smo v 49. tednu leta 2014...

strelec commented 9 years ago

Sedaj pa je čas - ne za vmesno poročilo, ampak za končno.

Naj na kratko opiševa orehe, ki sva jih morala rešiti, da sva prišla do delujoče rešitve. Opisano spodaj je rezultat dolgotrajnega trial-and-error-ja in poizkušanja mnogih možnosti, izmed katerih sva izbrala najboljšo (pogosto pa kar edino delujočo :).

Na začetku smo se skupaj z vami odločili, da uporabiva navadno Reader monado za prenašanje konfiguracije, vendar to ni zadostovalo, ker potrebujemo, da lahko printer nosi značko, da ni uspel. To je med drugim potrebno za ničelni element za Alternative. Reader sicer lahko konstruiramo s fail, vendar je rezultat hard error, ki ga ni mogoče ujeti. Tako sva kasneje uporabila Reader transformer (ReaderT) na Maybe monadi. Tako sva pridobila tudi mplus, saj je Maybe instanca MonadPlus.

Paket, na katerega imava odvisnot (partial-isomorphisms), na žalost izmorfizem definira z običajno Maybe monado, kar pomeni, da printer ne more prenašati svojega okolja vanjo, saj bi bila potrebna neke vrste Reader monada. Tu sva imela možnost, da celotno izvorno kodo prekopirava v najin projekt, popraviva tip monade in vsak Just v return in Nothing v fail. To se imenuje "dependency bundling" in je primer slabe prakse, nekaj namigov na to temo nam lahko da Gentoo wiki (http://wiki.gentoo.org/wiki/Why_not_bundle_dependencies#When_code_is_bundled.3F) - najin primer pade pod točko 2 (you are shipping and using your own copy of a library).

Tako sva definirala nov, monadičen izomorfizem, ki sva ga poimenovala IsoM, odvisnost pa pustila pri miru. Sedaj pa je nastala dilema, kako naj pripravimo, da bosta ta dva izomorfizma enotno delovala v našem paketu.

Ker haskel ne podpira t.i. "union types", bi tako morali pri vsaki uporabi operatorja <$> levi agument zaviti v data konstruktor IsIso oz. IsIsoM. To bi zmanjšalo berljivost, zato sva se odločila, da vpeljeva nov operator <$$>. Navaden <$> tako ostaja nespremenjen, vendar dela z Maybe monado, zato konfiguracije ne moremo brati. Če hočemo konfiguracijo v izomofizmu tudi brati (ask), uporabimo <$$>.

Tu pa je nastal nov problem. V izomofizmu konfiguracije ne moremo popravljati z local, ker potrebuje kot parameter monado, na kateri želimo pognati spremenjeno okolje, te pa več nimamo, saj parameter preslikave poljubne strani izomorfizma ni več monadičen:

data IsoM alpha beta
  = IsoM (alpha -> Maybe beta) (beta -> MaybeR alpha)

Vpeljala sva nov funktor, ki v primeru Printerja popravi lokalno konfiguracijo, v primeru parserja pa je navadna identiteta (f je Parser ali Printer):

  (<-$>) :: (Config -> Config) -> f alpha -> f alpha

S tem nisva splošnosti naredila nobene škode, knjižnica pa je malo lažja za uporabo.

Napisala sva konfigurabilen syntax beautifier za JSON (aka. parametriziran parser / pretty printer). Vsi elementi abstraktne sintakse so kar se da čisti - stringe dobimo v čisti obliki, z realiziranimi "escape sequencami", JSON object je predstavljen kot Map String JValue in ne morda [(String, JValue)].

Pri tem sva napisala kar nekaj svojih izomorfizmov, recimo elements (in uporabila Data.Bimap za učinkovito izvedbo), pretvarjanje znaka v njegov Unicode codepoint, pretvarjanje desetiške številke v šestnajstiško. Večina izvorne kode je dejansko najine in ni bila del že narejenga paketa na Hackage, če pa že, sva dano kodo olepšala, kjer se je dalo.

Vesela bova še kakšnih namigov, če se da še kaj narediti boljše.

Lastnosti projekta:

strelec commented 9 years ago

Sporočam še, da mi je uspelo naredit še zadno stvar, in sicer polimofičen config glede na jezik (JsonConfig, ConfigC).

Fun fact: parametrizacijo je bilo treba narediti na 71 mestih.

https://github.com/strelec/IPRM-2014/commit/a1d935657181235fecbed3ef396c65203cc73fbd

andrejbauer commented 9 years ago

Jao. No evo, tu bi pa prav prišli funktorji.