Funkcionální programátor

JSH

Re:Funkcionální programátor
« Odpověď #390 kdy: 08. 07. 2015, 08:30:34 »
Citace od: Mirek Prýmek kdy 08. 07. 2015, 01:31:59
Věta "přidáme tam monádu a máme pure X" je stejně nesmyslná jako "přidáme tam <cokoli jinýho> a máme pure X". Purity není dáno tím, jestli jazyk má nebo nemá monády. Monády jsou NÁSTROJ, jak V ČISTÉM JAZYCE něco udělat. V nečistém jazyce tento nástroj

1. nepotřebuješ
Ale hodí se. Momentálně se to na mailinglistu k boostu (C++ knihovny) monádama jenom hemží. A ta diskuze se netočí kolem užitečnosti. Diskutuje se hlavně, jak je nalakovat, aby se z nich "normální" C++ programátoři na místě nepodělali.

Ono C++ teď z funkcionálních jazyků bere překvapivě hodně. Furt je to hybrid, ale s std::function a funkčními objekty se dají dělat zajímavé věci.


uvw

Re:Funkcionální programátor
« Odpověď #391 kdy: 08. 07. 2015, 09:19:16 »
Citace od: JSH kdy 08. 07. 2015, 08:30:34
Ale hodí se. Momentálně se to na mailinglistu k boostu (C++ knihovny) monádama jenom hemží. A ta diskuze se netočí kolem užitečnosti. Diskutuje se hlavně, jak je nalakovat, aby se z nich "normální" C++ programátoři na místě nepodělali.

Takže mám nečistý imperativní jazyk, do něho si dám čistou monádu a do monády si dám nečistý imperativní kód ? Jako kratochvíle na nedělní odpoledne dobré ;D

Radek Miček

Re:Funkcionální programátor
« Odpověď #392 kdy: 08. 07. 2015, 09:27:25 »
Citace od: uvw kdy 08. 07. 2015, 09:19:16
Citace od: JSH kdy 08. 07. 2015, 08:30:34
Ale hodí se. Momentálně se to na mailinglistu k boostu (C++ knihovny) monádama jenom hemží. A ta diskuze se netočí kolem užitečnosti. Diskutuje se hlavně, jak je nalakovat, aby se z nich "normální" C++ programátoři na místě nepodělali.

Takže mám nečistý imperativní jazyk, do něho si dám čistou monádu a do monády si dám nečistý imperativní kód ? Jako kratochvíle na nedělní odpoledne dobré ;D

Hodí se to například na modelování efektů, které v tom jazyce nejsou. Například vymezených kontinuací.

Radek Miček

Re:Funkcionální programátor
« Odpověď #393 kdy: 08. 07. 2015, 09:28:30 »
Citace od: uvw kdy 08. 07. 2015, 09:19:16
Citace od: JSH kdy 08. 07. 2015, 08:30:34
Ale hodí se. Momentálně se to na mailinglistu k boostu (C++ knihovny) monádama jenom hemží. A ta diskuze se netočí kolem užitečnosti. Diskutuje se hlavně, jak je nalakovat, aby se z nich "normální" C++ programátoři na místě nepodělali.

Takže mám nečistý imperativní jazyk, do něho si dám čistou monádu a do monády si dám nečistý imperativní kód ? Jako kratochvíle na nedělní odpoledne dobré ;D

Také tím můžete zajistit, aby vám nepřetekl zásobník.

JSH

Re:Funkcionální programátor
« Odpověď #394 kdy: 08. 07. 2015, 09:28:49 »
Citace od: uvw kdy 08. 07. 2015, 09:19:16
Takže mám nečistý imperativní jazyk, do něho si dám čistou monádu a do monády si dám nečistý imperativní kód ? Jako kratochvíle na nedělní odpoledne dobré ;D
Monáda je matematická struktura. Není čistá ani nečistá. Čistota je vlastnost jazyka.
Jedno z využití monád je skládání IO operací za sebe v čistých jazycích. Další využití je třeba skládání řetězcových operací, skládání operací co můžou selhat, přidání nějakého kontextu a podobně. Monáda je všudypřítomný vzor a zjednodušovat ho na IO objekt je zásadní chyba.


JSH

Re:Funkcionální programátor
« Odpověď #395 kdy: 08. 07. 2015, 09:37:42 »
Citace od: Radek Miček kdy 08. 07. 2015, 09:27:25
Hodí se to například na modelování efektů, které v tom jazyce nejsou. Například vymezených kontinuací.
Jo, skládání asynchronních operací momentálně vypadá jako killer app. Aspoň teda v C++.

Re:Funkcionální programátor
« Odpověď #396 kdy: 08. 07. 2015, 09:38:28 »
Citace od: xyz kdy 08. 07. 2015, 02:55:11
Tento zdroják (presnejšie by sme mali povedať: dátová štruktúra jazyka C/FPP) je potom spracovaný v runtime systéme, ktorý môže byť z dôvodov efektívnosti realizovaný prekladom do strojového kódu.
Dobře, ale nerozumím romu, co se snažíš říct, kam se chceš dobrat.

Citace od: xyz kdy 08. 07. 2015, 02:55:11
Ináč som si nie istý, či som ťa správne pochopil: tým čistým funkcionálnym jazykom nazývaš len FPP alebo C/FPP?
FPP je čistý, to jsme si dali do definice. FPP produkuje string, který se dá interpretovat jako zdroják v C, což čistý jazyk není.

Nevím, jakou tam hledáš záludnost. Říkal jsem to proto, že stejným způsobem runtime Haskellu interpretuje ty IO instrukce, což je taky jenom nějaká datová struktura (jako ten string) a úplně stejným způsobem z toho NEplyne, že Haskell není čistý jazyk.

Re:Funkcionální programátor
« Odpověď #397 kdy: 08. 07. 2015, 09:40:18 »
Citace od: JSH kdy 08. 07. 2015, 08:30:34
Ale hodí se.
Jasan. Myslel jsem, že ho nepotřebuješ pro normální IO.

uvw

Re:Funkcionální programátor
« Odpověď #398 kdy: 08. 07. 2015, 09:50:22 »
Citace od: Radek Miček kdy 08. 07. 2015, 09:27:25
Hodí se to například na modelování efektů, které v tom jazyce nejsou.

Modelování budiž.

Citace od: Radek Miček kdy 08. 07. 2015, 09:28:30
Také tím můžete zajistit, aby vám nepřetekl zásobník.

To žijete ve velkém omylu. Počáteční velikost zásobníku se dá volně měnit takže nevíte jak je velký a nikdy nevíte co tam kdo nasyslil před Vámi, neexistuje žádná obrana před tím proč by zrovna ve Vašem kódu nemohlo nastat přetečení zásobníku. Zrovna v C/C++ se často ještě před prvním řádkem uživatelského kódu alokuje na zásobníku.

Citace od: JSH kdy 08. 07. 2015, 09:28:49
Jedno z využití monád je skládání IO operací za sebe v čistých jazycích. Další využití je třeba skládání řetězcových operací, skládání operací co můžou selhat, přidání nějakého kontextu a podobně. Monáda je všudypřítomný vzor

Tomu všemu rozumím, jen mi to přišlo legrační :)

Re:Funkcionální programátor
« Odpověď #399 kdy: 08. 07. 2015, 09:52:33 »
Citace od: uvw kdy 08. 07. 2015, 09:50:22
neexistuje žádná obrana před tím proč by zrovna ve Vašem kódu nemohlo nastat přetečení zásobníku.
Existuje - ten zásobník prostě nevyužíváš. Triviální příklad: místo rekurze dáš for.

Citace od: uvw kdy 08. 07. 2015, 09:50:22
Tomu všemu rozumím, jen mi to přišlo legrační :)
Co je na tom legračního?

Radek Miček

Re:Funkcionální programátor
« Odpověď #400 kdy: 08. 07. 2015, 09:57:28 »
Citace od: uvw kdy 08. 07. 2015, 09:50:22
Citace od: Radek Miček kdy 08. 07. 2015, 09:28:30
Také tím můžete zajistit, aby vám nepřetekl zásobník.

To žijete ve velkém omylu. Počáteční velikost zásobníku se dá volně měnit takže nevíte jak je velký a nikdy nevíte co tam kdo nasyslil před Vámi, neexistuje žádná obrana před tím proč by zrovna ve Vašem kódu nemohlo nastat přetečení zásobníku. Zrovna v C/C++ se často ještě před prvním řádkem uživatelského kódu alokuje na zásobníku.

Jde o to, že kód mohu pomocí monád předělat tak, že využije pouze konstantní množství paměti na zásobníku - hodně se to používá například ve Scale (viz Stackless  Scala  With  Free  Monads).

uvw

Re:Funkcionální programátor
« Odpověď #401 kdy: 08. 07. 2015, 10:17:31 »
Citace od: Mirek Prýmek kdy 08. 07. 2015, 09:52:33
Existuje - ten zásobník prostě nevyužíváš.

V C/C++ nelze neužít zásobník. Míra jeho využití je daná rozmary tvůrců kompilátoru, viděl jsem kompilátor co dělá push/pop i uvnitř FOR.

Citace od: Radek Miček kdy 08. 07. 2015, 09:57:28
Jde o to, že kód mohu pomocí monád předělat tak, že využije pouze konstantní množství paměti na zásobníku

Konstantní nároky na zásobník jsou OK. Ale to šlo vždycky, monády na to nemají patent.

JSH

Re:Funkcionální programátor
« Odpověď #402 kdy: 08. 07. 2015, 10:32:19 »
Citace od: uvw kdy 08. 07. 2015, 10:17:31
Konstantní nároky na zásobník jsou OK. Ale to šlo vždycky, monády na to nemají patent.
Tak samozřejmě, mluvíme přece o výpočetně úplných jazycích. Monády "jen" výrazně ulehčují programátorovi práci. Stejně jako všechno ostatní co kdy bylo kolem programovacích jazyků vymyšleno. :)

Re:Funkcionální programátor
« Odpověď #403 kdy: 08. 07. 2015, 10:39:33 »
Citace od: uvw kdy 08. 07. 2015, 10:17:31
V C/C++ nelze neužít zásobník. Míra jeho využití je daná rozmary tvůrců kompilátoru, viděl jsem kompilátor co dělá push/pop i uvnitř FOR.

Citace
A small comment: Even though the C++ solution corresponds to a recursive function in Haskell, it isn't actually recursive. The Loop is not calling itself -- it creates a new Loop object. You can run this code under the debugger and see that the program's stack is not growing. Neither is heap space for that matter -- the Loop objects are constantly recycled.
https://www.fpcomplete.com/blog/2012/06/asynchronous-api-in-c-and-the-continuation-monad

uvw

Re:Funkcionální programátor
« Odpověď #404 kdy: 08. 07. 2015, 14:00:49 »
Citace od: JSH kdy 08. 07. 2015, 10:32:19
Tak samozřejmě, mluvíme přece o výpočetně úplných jazycích. Monády "jen" výrazně ulehčují programátorovi práci. Stejně jako všechno ostatní co kdy bylo kolem programovacích jazyků vymyšleno. :)

Až to bude v jazyku pak to bude významné ulehčení. Do té doby si to nemyslím.

Citace od: Mirek Prýmek kdy 08. 07. 2015, 10:39:33
You can run this code under the debugger and see that the program's stack is not growing.

Autor vypozoroval chování v tomto jednom případě pro jeho zdroják. Stejné chování pro jiné případy není zaručeno nijak, kompilátor C/C++ má ohledně stacku dost velkou volnost. Dále bych se v tom nepitval, konstantní nároky na stack stačí :)