Funkcionální programátor

v

Re:Funkcionální programátor
« Odpověď #255 kdy: 05. 07. 2015, 13:21:51 »
ještě jednou mimo hlavní tok diskuze - napsali jste už nějakou netriviální aplikaci ve funkcionálním jazyce? co a v jakém?
já kalkulačku (jak jinak) a tvořím překladač jednoho ne moc známého programovacího jazyka, v Haskellu


JSH

Re:Funkcionální programátor
« Odpověď #256 kdy: 05. 07. 2015, 13:22:17 »
Jestli Vám mohu skočit do řeči. Když jsem si detailně pročítal tuto diskuzi. Narazil jsem na další způsob IO v čistém jazyce. Mluvil o tom čumil. Reaktivita. Má s ní někdo tady zkušenost? Zkoušel jsem čumilem doporučovaný jazyk Elm, a je to opravdu hodně, hodně zajímavé z mého laického pohledu.
Zatím jsem na Elm koukal jenom zběžně, ale když si přeložím marketingové žvásty do češtiny tak to nevypadá nic moc. Konkrétně třeba "No runtime exceptions". Ten jazyk se vážně chlubí tím, že buď všechno perfektně funguje nebo to naprosto neopravitelně padne na hubu? Na webové appky asi dobrý, no ... ::)

Re:Funkcionální programátor
« Odpověď #257 kdy: 05. 07. 2015, 13:32:43 »
ještě jednou mimo hlavní tok diskuze - napsali jste už nějakou netriviální aplikaci ve funkcionálním jazyce? co a v jakém?
Já píšu hodně v Elixiru, teď hlavně nástroj na event management (něco na způsob Logstash) + k němu webový rozhraní. Tohle je docela velkej projekt. Plus mám v Elixiru ještě hromadu všelijakých menších věcí. Když jsme u toho, pokud by někdo měl zájem, dost bych bral někoho, kdo by měl chuť se podílet na https://github.com/mprymek/symconfig (je to ve fázi proof of concept, pre-alpha. Tady na tom githubu je starší verze, teď už je to o kousek dál, jenom jsem to ještě nezveřejnil). Příklad použití: https://github.com/mprymek/symconfig-example1

Akorát teda nevím, jestli Elixir počítáš do funkcionálních jazyků :)

Konkrétně třeba "No runtime exceptions". Ten jazyk se vážně chlubí tím, že buď všechno perfektně funguje nebo to naprosto neopravitelně padne na hubu? Na webové appky asi dobrý, no ... ::)
Není to spíš tak, že se s chybami počítá předem, musíš je ošetřit a nepřekvapí tě až při běhu?

BoneFlute

  • *****
  • 2 047
    • Zobrazit profil
Re:Funkcionální programátor
« Odpověď #258 kdy: 05. 07. 2015, 13:35:13 »
Pro účely téhle debaty je podle mě nutný jazyk (syntaxe + typový systém) a runtime (sémantika, "výkonný stroj") odlišovat jako dvě různé věci.

Pořád nám zůstává otázka, jestli by nešel typový systém udělat tak, aby umožňoval běh ve víc vláknech a zároveň by nějakou typovou magií uměl poskytovat nějaké záruky ohledně těch vláken. Radek zmiňoval Rust a Mezzo. Já je neznám, takže neumím posoudit, jestli to takhle nějak dělají.

Odporuješ si. Pokud typem zajistíš, že nedojde k souběhu, a runtime to pak nedodrží tak jsi zase na začátku. Ono stačí prohlásit, že předpis je funkcionální, a už nesmí dojít k souběhu.


Ještě jeden příklad:
Budeme mět tu funkci sum :: Int -> Int -> Int. Tato funkce je implementována přímo v nějaké Cčkovské rutině, takže naprosto mimo kontrolu engine atd. Ale přestože je tato funkce blackbox, tak si nemůže dovolit (a věřím, že je to i nějak ošéfovaný) vracet string. To prostě nemůže. Nebo může?
Krom toho ta funkce může dělat i milion dalších věcí nad rámec typu. Může vypisovat do konzole, přepisovat disk a podobně. Haskell může jenom věřit programátorovi, že tam nedělá žádné prasárny. Pokud jo, smůla.
Co je nad rámec typu, to mě nezajímá. Ale musí vrátit Int. A musí jít substituovat za její hodnotu. A pokud té funkci takové substituování vadí, tak porušuje kontrakt, není funkcionální.

BoneFlute

  • *****
  • 2 047
    • Zobrazit profil
Re:Funkcionální programátor
« Odpověď #259 kdy: 05. 07. 2015, 13:37:59 »
ještě jednou mimo hlavní tok diskuze - napsali jste už nějakou netriviální aplikaci ve funkcionálním jazyce? co a v jakém?
já kalkulačku (jak jinak) a tvořím překladač jednoho ne moc známého programovacího jazyka, v Haskellu
Dělal jsem hru, byl na výběr z několika perokreseb, menu s barvičkama, a uživatel tam myší vyplňoval barevné plochy. Načítání z png, svg.


Re:Funkcionální programátor
« Odpověď #260 kdy: 05. 07. 2015, 13:42:43 »
Odporuješ si. Pokud typem zajistíš, že nedojde k souběhu, a runtime to pak nedodrží tak jsi zase na začátku.
Říkal jsem, že nevím, jestli je to vůbec možné, pomocí typového systému něco takového garantovat, popř. do jaké míry, zas tak moc do té teorie nevidím, o tom by se musel rozepsat asi spíš Radek...

Runtime musí dodržet sémantiku jazyka. Nemůže si dělat co chce. Může dělat cokoli, ale jenom tak, aby zachoval význam programu.

Ono stačí prohlásit, že předpis je funkcionální, a už nesmí dojít k souběhu.
Já vlastně nevím, co tohle tvrzení říká. Asi bys to musel rozepsat víc formálně, abysme vůbec věděli, o čem je řeč.

v

Re:Funkcionální programátor
« Odpověď #261 kdy: 05. 07. 2015, 13:45:48 »
Ono stačí prohlásit, že předpis je funkcionální, a už nesmí dojít k souběhu.
Já vlastně nevím, co tohle tvrzení říká. Asi bys to musel rozepsat víc formálně, abysme vůbec věděli, o čem je řeč.

k výzvě se připojuju, hlavní problém je z mého pohledu nejasnost definic, aji nějaké ty kousky kódu demonstrující debatované problémy by nezaškodily

Greenhorn

Re:Funkcionální programátor
« Odpověď #262 kdy: 05. 07. 2015, 13:54:39 »
Jestli Vám mohu skočit do řeči. Když jsem si detailně pročítal tuto diskuzi. Narazil jsem na další způsob IO v čistém jazyce. Mluvil o tom čumil. Reaktivita. Má s ní někdo tady zkušenost? Zkoušel jsem čumilem doporučovaný jazyk Elm, a je to opravdu hodně, hodně zajímavé z mého laického pohledu.
Zatím jsem na Elm koukal jenom zběžně, ale když si přeložím marketingové žvásty do češtiny tak to nevypadá nic moc. Konkrétně třeba "No runtime exceptions". Ten jazyk se vážně chlubí tím, že buď všechno perfektně funguje nebo to naprosto neopravitelně padne na hubu? Na webové appky asi dobrý, no ... ::)
V čistém kódu pokud to chápu správně nemohou být exceptions. Takže Elm to řeší pomocí Maybe a Either. A je to fakt úžasný, když píšu, cítím se jako když píšu funkcionálně, a nemám takový divný pocit jako když píšu něco v Haskellu a plete se mi do toho imperativní IO.

JSH

Re:Funkcionální programátor
« Odpověď #263 kdy: 05. 07. 2015, 13:55:40 »
ještě jednou mimo hlavní tok diskuze - napsali jste už nějakou netriviální aplikaci ve funkcionálním jazyce? co a v jakém?
já kalkulačku (jak jinak) a tvořím překladač jednoho ne moc známého programovacího jazyka, v Haskellu
Já psal v Haskellu úpravy syntaktického stromu a generování GLSL. Snažil jsem se o genetickou optimalizaci shaderů a automatické přehazování výpočtů mezi nimi. Výsledek stál za starou bačkoru, ale ne zásluhou FP. Díky FP jsem jen velice rychle zjistil že tudy cesta pravděpodobně nevede. A odnesl jsem si silné pohrdání visitor patternem, páč jsem pak můj kód porovnával se shader optimizerem :)

Není to spíš tak, že se s chybami počítá předem, musíš je ošetřit a nepřekvapí tě až při běhu?
Možná jo. Akorát mi tam pak nesedí ta zmínka o crash.

Když se kouknu na http://package.elm-lang.org/packages/elm-lang/core/2.1.0/Task tak mám jakýsi pocit dejavu :) Monád poznám i když se bind přejmenuje na andThen :P

Greenhorn

Re:Funkcionální programátor
« Odpověď #264 kdy: 05. 07. 2015, 13:58:21 »
ještě jednou mimo hlavní tok diskuze - napsali jste už nějakou netriviální aplikaci ve funkcionálním jazyce? co a v jakém?
já kalkulačku (jak jinak) a tvořím překladač jednoho ne moc známého programovacího jazyka, v Haskellu
Já osobně jsem udělal jednodušší IDE a teď dělám interpretr takového malého bezvýznamného jazyka. Na nic link nedám, protože to opravdu není hezký kód, nejsem zatím mistr, a také to není dodělané. Obojí v Haskellu.

v

Re:Funkcionální programátor
« Odpověď #265 kdy: 05. 07. 2015, 13:59:55 »
Jestli Vám mohu skočit do řeči. Když jsem si detailně pročítal tuto diskuzi. Narazil jsem na další způsob IO v čistém jazyce. Mluvil o tom čumil. Reaktivita. Má s ní někdo tady zkušenost? Zkoušel jsem čumilem doporučovaný jazyk Elm, a je to opravdu hodně, hodně zajímavé z mého laického pohledu.
Zatím jsem na Elm koukal jenom zběžně, ale když si přeložím marketingové žvásty do češtiny tak to nevypadá nic moc. Konkrétně třeba "No runtime exceptions". Ten jazyk se vážně chlubí tím, že buď všechno perfektně funguje nebo to naprosto neopravitelně padne na hubu? Na webové appky asi dobrý, no ... ::)
V čistém kódu pokud to chápu správně nemohou být exceptions. Takže Elm to řeší pomocí Maybe a Either. A je to fakt úžasný, když píšu, cítím se jako když píšu funkcionálně, a nemám takový divný pocit jako když píšu něco v Haskellu a plete se mi do toho imperativní IO.

jestli se vám takhle plete IO do kódu v Haskellu, tak něco děláte blbě, já mám v IO monádě u překladače cca 180 řádků (z cca 10k) a to je moc a až se jednou budu hodně nudit, tak to vyčistím na 50 max. (sosnout argumenty a vstupní soubory, vyplivnout binárku)

JSH

Re:Funkcionální programátor
« Odpověď #266 kdy: 05. 07. 2015, 14:06:24 »
V čistém kódu pokud to chápu správně nemohou být exceptions.
Můžou. Může to být jenom syntaktický cukříček nad tím že každá funkce vrací např (Either X Error). Dá se to tak i implementovat.
Citace
Takže Elm to řeší pomocí Maybe a Either.
Takový Haskell taky. A díky tomu, že jsou to tam monády se dá většina testů vygenerovat automaticky stylem jedna operce selže, zbytek se přeskočí a celek selže taky.
Citace
A je to fakt úžasný, když píšu, cítím se jako když píšu funkcionálně, a nemám takový divný pocit jako když píšu něco v Haskellu a plete se mi do toho imperativní IO.
A co takhle imperativní Task? Porovnej si typy funkcí kolem Tasku s funkcema kolem IO. Task se dá akorát parametrizovat i chybovou hodnotou. Jinak je to na jedno kopyto.

Radek Miček

Re:Funkcionální programátor
« Odpověď #267 kdy: 05. 07. 2015, 14:09:04 »
Rust vs. race condition:
https://news.ycombinator.com/item?id=7009502
všimněte si jak rozlišují "race condition" a "data race"

poznámka bokem - překládalo se "race condition" vždycky jako "souběh"? na střední jsme tomu říkali "hazard" nebo "hazardní stav"

Ano, to jsem popletl, typový systém Rustu (pokud ho neobejdete) zabrání data racům i v programu s více vlákny - nikoliv souběhům.

Greenhorn

Re:Funkcionální programátor
« Odpověď #268 kdy: 05. 07. 2015, 14:19:17 »
V čistém kódu pokud to chápu správně nemohou být exceptions.
Můžou. Může to být jenom syntaktický cukříček nad tím že každá funkce vrací např (Either X Error). Dá se to tak i implementovat.
Citace
Takže Elm to řeší pomocí Maybe a Either.
Takový Haskell taky. A díky tomu, že jsou to tam monády se dá většina testů vygenerovat automaticky stylem jedna operce selže, zbytek se přeskočí a celek selže taky.
Citace
A je to fakt úžasný, když píšu, cítím se jako když píšu funkcionálně, a nemám takový divný pocit jako když píšu něco v Haskellu a plete se mi do toho imperativní IO.
A co takhle imperativní Task? Porovnej si typy funkcí kolem Tasku s funkcema kolem IO. Task se dá akorát parametrizovat i chybovou hodnotou. Jinak je to na jedno kopyto.
Vidíte, to mne nenapadlo. Já proti monádám nic nemám. To si zase nemyslete. A Task není imperativní, on nedělá žádné vedlejší efekty. Obsahuje pouze informace o tom, co se má udělat, a myslím že to lze i asynchronně. A tyto Tasky jsou poté pomocí signálů poslané do výstupních portů běhového prostředí, které už rozkazy vykoná, a případnou reakci zase pošle skrz vstupní porty z kterých je signály zase rozešlou do zbytku programu. Všechno je krásně čisté.

Re:Funkcionální programátor
« Odpověď #269 kdy: 05. 07. 2015, 14:26:51 »
A Task není imperativní, on nedělá žádné vedlejší efekty. Obsahuje pouze informace o tom, co se má udělat [...] A tyto Tasky jsou poté pomocí signálů poslané do výstupních portů běhového prostředí, které už rozkazy vykoná, a případnou reakci zase pošle skrz vstupní porty z kterých je signály zase rozešlou do zbytku programu. Všechno je krásně čisté.
...což je prakticky to samé jako IO monáda ;)