Funkcionální programátor

JSH

Re:Funkcionální programátor
« Odpověď #405 kdy: 08. 07. 2015, 14:23:48 »
Až to bude v jazyku pak to bude významné ulehčení. Do té doby si to nemyslím.
To je vtip? :o Vždyť už se to používá. Jakou další podporu bys ještě chtěl?


uvw

Re:Funkcionální programátor
« Odpověď #406 kdy: 08. 07. 2015, 15:17:36 »
Vždyť už se to používá. Jakou další podporu bys ještě chtěl?

Zvýšení pohodlí. Lambda funkce se taky daly používat odjakživa, ale až od zavedení podpory v jazycích to není spíše opruz ale spíše přínos.

xyz

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

Snažím sa povedať, že C/FPP je čistý funkcionálny jazyk.

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.
Tú otázku som tam dal preto, lebo som si nebol (a stále si nie som) istý, či sa zhodneme na čistote jazyka C/FPP. (Samozrejme, stále som si vedomý toho, že FPP nebol poriadne definovaný.)

Re:Funkcionální programátor
« Odpověď #408 kdy: 09. 07. 2015, 00:54:12 »
Tú otázku som tam dal preto, lebo som si nebol (a stále si nie som) istý, či sa zhodneme na čistote jazyka C/FPP. (Samozrejme, stále som si vedomý toho, že FPP nebol poriadne definovaný.)
Ale C/FPP není žádný jazyk. Jazyk je buď C nebo FPP. Představ si, že bys měl jazyk BLB, který by měl jediný typ: string a jedinou operaci: RETURN. A pak bys v něm napsal takovýhle program:

Kód: [Vybrat]
RETURN '
void f() {
  puts("Hola hola hola\n");
}

int main () {
  f();
  return 0;
}
'

Znamená to snad, že "jazyk BLB/C" má funkce? Že umí vypsat něco na výstup? Ne. Žádný jazyk BLB/C neexistuje, tím míň se dá mluvit o nějakých jeho vlastnostech.

xyz

Re:Funkcionální programátor
« Odpověď #409 kdy: 10. 07. 2015, 01:28:13 »
Tú otázku som tam dal preto, lebo som si nebol (a stále si nie som) istý, či sa zhodneme na čistote jazyka C/FPP. (Samozrejme, stále som si vedomý toho, že FPP nebol poriadne definovaný.)
Ale C/FPP není žádný jazyk.
Ale áno, je. Má jasne definovanú syntax aj sémantiku a tiež runtime prostredie. (Teda mal by, keby sme dorobili detaily.)

Jazyk je buď C nebo FPP.
Alebo C/FPP. To predsa závisí len od definície syntaxe a sémantiky tohto jazyka. Asi ťa pletie, že tento úplne nový jazyk C/FPP (navyše s nešťastne zvoleným názvom) má toľko spoločného s jazykom C. Pokojne si môžeš predstaviť, že začneme s úplne novým jednoduchým funkcionálnym jazykom trebárs obsahujúcim monády a k nemu si definujeme taktiež úplne nový imperatívny jazyk (trebárs assembler nejakého virtuálneho procesora alebo priamo strojový kód, nech ten nový čistý funkcionálny jazyk naozaj stojí za to), ktorý bude vykonávaný v runtime prostredí. Na záver zvolíme vhodnejší názov, trebárs PURE.

Môžeš mi opäť napísať o Eiffelovej veži a zmrzline a hľadať v odkazovanom blogu formálne nedostatky na povrchu, alebo sa môžeš skúsiť naozaj zamyslieť nad tým, čo chcel autor toho blogu povedať. A myslím si, že práve s príkladmi takýchto čistých funkcionálnych jazykov majú mnohí ľudia problémy.  Zrejme práve k tomu smerovala aj námietka Greenhorna, akurát zvolil trochu nešťastnú metódu, keď chcel k C-čku pridávať monády a vyrábať z neho čistý funkcionálny jazyk. Radek Miček síce správne poukázal na problémy s tým spojené, obávam sa však, že to nejasnosti Greenhorna vôbec nezodpovedalo.  (Neviem čítať myšlienky ani nemôžem hovoriť za neho, to len odhadujem z analogických problémov, ktoré mávajú v diskusiách iní ľudia.)

Představ si, že bys měl jazyk BLB, který by měl jediný typ: string a jedinou operaci: RETURN. A pak bys v něm napsal takovýhle program:

Kód: [Vybrat]
RETURN '
void f() {
  puts("Hola hola hola\n");
}

int main () {
  f();
  return 0;
}
'

Znamená to snad, že "jazyk BLB/C" má funkce? Že umí vypsat něco na výstup?
Nijaký jazyk BLB/C sme si nedefinovali. Máme iba jazyk BLB, ktorý vypisuje nejaký text, v tomto prípade C-čkovský zdroják.

Ne. Žádný jazyk BLB/C neexistuje, tím míň se dá mluvit o nějakých jeho vlastnostech.
Správne, pokiaľ si taký jazyk nedefinujeme, tak neexistuje a nemá zmysel hovoriť o jeho vlastnostiach. To by sa zmenilo v okamihu, keby sme taký jazyk definovali. V tomto prípade by zrejme nasledovala obšírna definícia runtime prostredia schopného vykonávať C-čkovské programy. (A kvôli zamedzeniu nedorozumeniam by sme ho z BLB/C premenovali na BLBOST.)


Re:Funkcionální programátor
« Odpověď #410 kdy: 10. 07. 2015, 07:41:29 »
Správne, pokiaľ si taký jazyk nedefinujeme, tak neexistuje a nemá zmysel hovoriť o jeho vlastnostiach. To by sa zmenilo v okamihu, keby sme taký jazyk definovali. V tomto prípade by zrejme nasledovala obšírna definícia runtime prostredia schopného vykonávať C-čkovské programy. (A kvôli zamedzeniu nedorozumeniam by sme ho z BLB/C premenovali na BLBOST.)
I když si to nadefinuješ jak chceš, jsou jenom dvě možnosti:

1. celou syntax a sémantiku jazyka C zahrneš do definice jazyka BLBOST => jazyk BLBOST nemůže být pure, protože C není.

2. nezahrneš - jazyk BLBOST má prostě opravdu jenom return a string. Obsah stringu neřeší => jazyk BLBOST je pure, ale neumí dělat IO, neumí zkontrolovat korektnost toho C programu atd.

Re:Funkcionální programátor
« Odpověď #411 kdy: 10. 07. 2015, 07:48:14 »
Ještě dovětek, ať si rozumíme...

2. nezahrneš - jazyk BLBOST má prostě opravdu jenom return a string. Obsah stringu neřeší => jazyk BLBOST je pure, ale neumí dělat IO, neumí zkontrolovat korektnost toho C programu atd.

Hlavní problém je v tom, že jazyk BLBOST nepřináší žádné výhody čistého funkcionálního jazyka, je to pořád jenom "(s)prosté céčko". Teprve pokud bych s těmi datovými strukturami mohl nějak manipulovat, tak by mi to něco přineslo. Jenže to bych musel tomu céčku uvnitř stringu rozumět => varianta 1

xyz

Re:Funkcionální programátor
« Odpověď #412 kdy: 11. 07. 2015, 02:29:48 »
Správne, pokiaľ si taký jazyk nedefinujeme, tak neexistuje a nemá zmysel hovoriť o jeho vlastnostiach. To by sa zmenilo v okamihu, keby sme taký jazyk definovali. V tomto prípade by zrejme nasledovala obšírna definícia runtime prostredia schopného vykonávať C-čkovské programy. (A kvôli zamedzeniu nedorozumeniam by sme ho z BLB/C premenovali na BLBOST.)
I když si to nadefinuješ jak chceš, jsou jenom dvě možnosti:

1. celou syntax a sémantiku jazyka C zahrneš do definice jazyka BLBOST => jazyk BLBOST nemůže být pure, protože C není.

2. nezahrneš - jazyk BLBOST má prostě opravdu jenom return a string. Obsah stringu neřeší => jazyk BLBOST je pure, ale neumí dělat IO, neumí zkontrolovat korektnost toho C programu atd.

3. Syntax a sémantika jazyka C bude súčasťou definície runtimu jazyka C/FPP.
=> jazyk C/FPP bude čistý, lebo FPP je čistý
=> jazyk C/FPP bude schopný nielen skontrolovať syntaktickú správnosť, ale aj vykonávať program v jazyku C, lebo syntax a sémantika jazyka C sú súčasťou definície runtimu

Len dodávam, že variant (1) zodpovedá prístupu, ktorý zvolil Greenhorn a variant (2) zodpovedá tvojej predstave C/FPP ako dvoch rozličných jazykov.

(Snáď nevadí, že som sa opäť vrátil k C/FPP namiesto jazyka BLBOST, ktorý je naozaj ešte väčší extrém než pôvodný C/CPP, kde ti vadila turingovská neúplnosť CPP.)

Hlavní problém je v tom, že jazyk BLBOST nepřináší žádné výhody čistého funkcionálního jazyka, je to pořád jenom "(s)prosté céčko".
Áno, v tomto zmysle je to ešte extrémnejší príklad než pôvodné C/CPP.

Teprve pokud bych s těmi datovými strukturami mohl nějak manipulovat, tak by mi to něco přineslo. Jenže to bych musel tomu céčku uvnitř stringu rozumět => varianta 1
Alebo variant (3). A dodávam, že pri vhodnej definícii FPP sa v jazyku C/FPP môže dať celkom dobre pracovať aj bez využitia jeho "C-monády". No a v prípade potreby (alebo len chuti) môžeš v "C-monáde" písať ten najšpinavší imperatívny kód akého budeš schopný a stále bude všetko funkcionálne čisté.

Re:Funkcionální programátor
« Odpověď #413 kdy: 11. 07. 2015, 08:43:04 »
3. Syntax a sémantika jazyka C bude súčasťou definície runtimu jazyka C/FPP.
=> jazyk C/FPP bude čistý, lebo FPP je čistý
=> jazyk C/FPP bude schopný nielen skontrolovať syntaktickú správnosť, ale aj vykonávať program v jazyku C, lebo syntax a sémantika jazyka C sú súčasťou definície runtimu
Potom jsi ale změnil běžné chápání pojmu "runtime", protože ten běžně žádnou syntax nemá a nekontroluje, protože nic nepřekládá. Jen vykonává nějaký kód (např. VM Javy).

Pak teda jsou dvě možnosti:

1. To, co popisuješ, je vlastně normální transpiller. Např. jazyk PureScript je čistý a překládá se do JavaScriptu, který čistý není.

2. Nejde o transpiller, ale fungovalo by to tak, že PureScript by svým během generoval JavaScript.

A co z toho všeho teda vyvozuješ? Proč se o tom vlastně bavíme?

PH

Re:Funkcionální programátor
« Odpověď #414 kdy: 11. 07. 2015, 12:08:05 »
3. Syntax a sémantika jazyka C bude súčasťou definície runtimu jazyka C/FPP.
=> jazyk C/FPP bude čistý, lebo FPP je čistý
=> jazyk C/FPP bude schopný nielen skontrolovať syntaktickú správnosť, ale aj vykonávať program v jazyku C, lebo syntax a sémantika jazyka C sú súčasťou definície runtimu
Potom jsi ale změnil běžné chápání pojmu "runtime", protože ten běžně žádnou syntax nemá a nekontroluje, protože nic nepřekládá. Jen vykonává nějaký kód (např. VM Javy).

Pak teda jsou dvě možnosti:

1. To, co popisuješ, je vlastně normální transpiller. Např. jazyk PureScript je čistý a překládá se do JavaScriptu, který čistý není.

2. Nejde o transpiller, ale fungovalo by to tak, že PureScript by svým během generoval JavaScript.

A co z toho všeho teda vyvozuješ? Proč se o tom vlastně bavíme?

Píše se "transpiLer". Nepoužíváme cizí slova, která neumíme napsat ;)

Re:Funkcionální programátor
« Odpověď #415 kdy: 11. 07. 2015, 13:18:00 »
Píše se "transpiLer".
Jistě. Děkuji za tuto velmi důležitou připomínku.

xyz

Re:Funkcionální programátor
« Odpověď #416 kdy: 11. 07. 2015, 22:05:38 »
3. Syntax a sémantika jazyka C bude súčasťou definície runtimu jazyka C/FPP.
=> jazyk C/FPP bude čistý, lebo FPP je čistý
=> jazyk C/FPP bude schopný nielen skontrolovať syntaktickú správnosť, ale aj vykonávať program v jazyku C, lebo syntax a sémantika jazyka C sú súčasťou definície runtimu
Potom jsi ale změnil běžné chápání pojmu "runtime", protože ten běžně žádnou syntax nemá a nekontroluje, protože nic nepřekládá. Jen vykonává nějaký kód (např. VM Javy).
Kontrolu syntaxe samozrejme vykoná kompilátor C/FPP v rámci typovej kontroly, pretože "C" (alebo "C-monáda", či ako si to nazveme) je len ďalší z dátových typov, hoci o poznanie zložitejší než Int. Čistota jazyka sa tým nijako nenarúša, nakoľko k vykonaniu kódu obsiahnutého v tejto dátovej štruktúre dôjde až v runtime.

Pokiaľ ide o runtime, je len otázkou implementácie, či bude vykonávaný priamo kód zapísaný programátorom (tak by tomu zrejme bolo, ak by sme za imperatívny jazyk zvolili trebárs strojový kód nejakého virtuálneho procesora, ako som popisoval v skoršom príspevku) alebo kompilátor túto dátovú štruktúru uloží v inom tvare, vhodnejšom na neskoršie vykonanie v runtime. Tento implementačný detail predsa nijako nenarúša myšlienku vyjadrenú v mojom predchádzajúcom príspevku.

Pak teda jsou dvě možnosti:

1. To, co popisuješ, je vlastně normální transpiller. Např. jazyk PureScript je čistý a překládá se do JavaScriptu, který čistý není.

2. Nejde o transpiller, ale fungovalo by to tak, že PureScript by svým během generoval JavaScript.

3. "C" resp. "C-monáda" je dátový typ jazyka C/FPP, ktorý sa vykonáva v runtime.

Variant (2) nevyhovuje: jazyk C/FPP negeneruje svojím behom program v jazyku C. V runtime sa iba vykonáva kód, ktorý už je obsiahnutý v dátovej štruktúre C-monády.

Variant (1) mi nie je jasný vôbec: malo by ísť o transpiler z C do C? Ako som písal vyššie, FPP môže byť celkom sebestačný funkcionálny jazyk, ktorého C-monádu nemusíš vôbec použiť - v tom prípade by sa teda do C nič neprekladalo. A keď ju už použiješ, tak sa v runtime vykonáva priamo tebou napísaný kód v jazyku C. Tak kde je tam transpiler?

A co z toho všeho teda vyvozuješ? Proč se o tom vlastně bavíme?
To, že C/FPP je čistý funkcionálny jazyk "obsahujúci C-čko". Už som na to predsa odpovedal. (A v predchádzjúcom príspevku som aj popísal, v akom zmysle "obsahuje C-čko": máš tam dátovú štruktúru, napríklad "C-monádu", v ktorej môžeš písať imperatívny kód v C-čku, hoci všetko zostáva funkcionálne čisté.)

Re:Funkcionální programátor
« Odpověď #417 kdy: 11. 07. 2015, 22:33:14 »
To, že C/FPP je čistý funkcionálny jazyk "obsahujúci C-čko". Už som na to predsa odpovedal. (A v predchádzjúcom príspevku som aj popísal, v akom zmysle "obsahuje C-čko": máš tam dátovú štruktúru, napríklad "C-monádu", v ktorej môžeš písať imperatívny kód v C-čku, hoci všetko zostáva funkcionálne čisté.)
A dál? Co tím chceš teda říct?

P.S. "monáda" je v tomhle případě imho zavádějící termín, protože monáda je přesně definovaná struktura a moc si neumím z fleku představit, jak bys ji napasoval na tuhle svoji představu. Ty bys ve skutečnosti můžeš z toho FPP generovat buď string (to by ale neodpovídalo tvé definici, protože by se ti s tím stringem obtížně manipulovalo), nebo spíš AST (naparsované céčko). Ke generování AST monádu nepotřebuješ.

Re:Funkcionální programátor
« Odpověď #418 kdy: 11. 07. 2015, 22:37:45 »
P.P.S. Úplně stejně můžeš místo "FPP/C" mít jazyk, který podporuje makra - tam pak máš de facto taky "dvě vrstvy jazyka". Pokud by sis tu první (makrosystém) omezil tak, aby byla čistá, a ta druhá by čistá nebyla, máš totéž a bez lopocení se s nějakým céčkem...

viz http://elixir-lang.org/getting-started/meta/macros.html - pokud bys makra předefinoval tak, aby byla čistá a případně i lazy, seš tam, kde chceš být.

xyz

Re:Funkcionální programátor
« Odpověď #419 kdy: 11. 07. 2015, 23:28:04 »
To, že C/FPP je čistý funkcionálny jazyk "obsahujúci C-čko". Už som na to predsa odpovedal. (A v predchádzjúcom príspevku som aj popísal, v akom zmysle "obsahuje C-čko": máš tam dátovú štruktúru, napríklad "C-monádu", v ktorej môžeš písať imperatívny kód v C-čku, hoci všetko zostáva funkcionálne čisté.)
A dál? Co tím chceš teda říct?
Ďalej už nič. To, čo som chcel povedať, bolo v základe vyjadrené už v mojom prvom príspevku. Zvyšok bol už len vysvetľovaním. Príklad "čistého funkcionálneho jazyka obsahujúceho C-čko" skrátka považujem za vhodný ilustračný príklad, nakoľko u mnohých ľudí (súdiac podľa rozličných diskusií) predstava čistého funkcionálneho jazyka nezodpovedá definícii.  (A k tomu som dával aj ten príklad so spojitými funkciami, aby sa rozplynuli hmly aj nad touto mojou analógiou.)

P.S. "monáda" je v tomhle případě imho zavádějící termín, protože monáda je přesně definovaná struktura a moc si neumím z fleku představit, jak bys ji napasoval na tuhle svoji představu. Ty bys ve skutečnosti můžeš z toho FPP generovat buď string (to by ale neodpovídalo tvé definici, protože by se ti s tím stringem obtížně manipulovalo), nebo spíš AST (naparsované céčko). Ke generování AST monádu nepotřebuješ.
Netvrdil som, že to musí byť robené práve cez monády, hoci aj tie môžu byť užitočné. Môžeme si predstaviť trebárs "CF-monádu" obsahujúcu C-čkovské filtre a spájanie monád by v takom prípade fungovalo ako rúra. (Snáď je táto myšlienka na linuxovom fóre dostatočne zrejmá aj bez ďalšieho popisu.)

P.P.S. Úplně stejně můžeš místo "FPP/C" mít jazyk, který podporuje makra - tam pak máš de facto taky "dvě vrstvy jazyka". Pokud by sis tu první (makrosystém) omezil tak, aby byla čistá, a ta druhá by čistá nebyla, máš totéž a bez lopocení se s nějakým céčkem...

viz http://elixir-lang.org/getting-started/meta/macros.html - pokud bys makra předefinoval tak, aby byla čistá a případně i lazy, seš tam, kde chceš být.
Áno, veď v pôvodnom odkaze bolo práve makro, išlo predsa o C/CPP. Tento príklad si však vtedy označil za zavádzajúci, a tak sme si to trochu poobjasňovali.