Funkcionální programátor

JSH

Re:Funkcionální programátor
« Odpověď #390 kdy: 08. 07. 2015, 08:30:34 »
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 »
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 »
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 »
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 »
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 »
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 »
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.

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 »
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 »
Hodí se to například na modelování efektů, které v tom jazyce nejsou.

Modelování budiž.

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.

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 »
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.

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 »
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 »
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.

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 »
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 »
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 »
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.

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čí :)