Nový objev ve funkcionálním programování

Re:Nový objev ve funkcionálním programování
« Odpověď #165 kdy: 20. 04. 2018, 23:04:27 »
jestli jste měl nějaký věcný dotaz, tak jsem ho musel přehlídnout
Ano, měl jsem dotaz, jestli tohle opravdu chcete předložit k diskusi, nebo ještě chcete trochu času na vylepšení.


v

Re:Nový objev ve funkcionálním programování
« Odpověď #166 kdy: 20. 04. 2018, 23:08:06 »
jestli jste měl nějaký věcný dotaz, tak jsem ho musel přehlídnout
Ano, měl jsem dotaz, jestli tohle opravdu chcete předložit k diskusi, nebo ještě chcete trochu času na vylepšení.
hned na prvním řádku: "připomínky vítány"
pravda, autorský záměr jsem osvětlil později

Re:Nový objev ve funkcionálním programování
« Odpověď #167 kdy: 20. 04. 2018, 23:08:59 »
hned na prvním řádku: "připomínky vítány"
Já to nechci připomínkovat, ptal jsem se na něco jinýho.

BoneFlute

  • *****
  • 2 083
    • Zobrazit profil
Re:Nový objev ve funkcionálním programování
« Odpověď #168 kdy: 20. 04. 2018, 23:09:43 »
"function lifting for dummies (with working knowledge of haskell)", technicky Moggi89
Dobře, tak ještě jinak: máte ještě vůbec zájem o nějakou diskusi? Položil jsem nějaké otázky, nevím, jestli mám čekat na odpověď nebo si radši jít rovnou užívat zaslouženého odpočinku, protože diskuse z vaší strany skončila monologem...

Prosím tě, zkrať to. Prostě řekni, co se ti na tom nelíbí, ať neplejtváme bajty.

Re:Nový objev ve funkcionálním programování
« Odpověď #169 kdy: 20. 04. 2018, 23:11:49 »
Prosím tě, zkrať to. Prostě řekni, co se ti na tom nelíbí, ať neplejtváme bajty.
Sorry, mě to taky nebaví, ale holt musím zjistit, jestli je "v" ochoten aspoň k normální komunikaci, tj. aspoň k odpovídání na nekomplikované otázky. Pokud není a tímpádem k žádné rozumné diskusi není prostor, tak já si tady honit triko nepotřebuju.


BoneFlute

  • *****
  • 2 083
    • Zobrazit profil
Re:Nový objev ve funkcionálním programování
« Odpověď #170 kdy: 20. 04. 2018, 23:20:49 »
Prosím tě, zkrať to. Prostě řekni, co se ti na tom nelíbí, ať neplejtváme bajty.
Sorry, mě to taky nebaví, ale holt musím zjistit, jestli je "v" ochoten aspoň k normální komunikaci, tj. aspoň k odpovídání na nekomplikované otázky. Pokud není a tímpádem k žádné rozumné diskusi není prostor, tak já si tady honit triko nepotřebuju.
No, posledních sedum stránek neděláte nic jiného.

Mě by se líbilo, když byste každý napsal svou definici, nějak to popsal, a dohadovat se o tom, kdo má pravdu se můžete potom.

Mě třeba baví dumat nad tím, že Maybe je monáda, Promise je monáda, endofunktor je nóbl výraz pro funkce. A teď to nějak spolu souvisí. Taky se mi líbilo "lift je operace která umožňuje aplikovat původní funkci v novém prostředí". To je inspirativní.

Češi jsou strašně hádavej národ.

Re:Nový objev ve funkcionálním programování
« Odpověď #171 kdy: 20. 04. 2018, 23:23:29 »
Mě by se líbilo, když byste každý napsal svou definici, nějak to popsal, a dohadovat se o tom, kdo má pravdu se můžete potom.
Já žádnou "svou definici" nemám a už vůbec nemám potřebu se o ni hádat.

endofunktor je nóbl výraz pro funkce
Není.

v

Re:Nový objev ve funkcionálním programování
« Odpověď #172 kdy: 20. 04. 2018, 23:23:33 »
"lift je operace která umožňuje aplikovat původní funkci v novém prostředí"
taky se mi to líbí, hned když jsem si to přečetl (https://wiki.haskell.org/Lifting) jsem věděl, že to chci vykrást

BoneFlute

  • *****
  • 2 083
    • Zobrazit profil
Re:Nový objev ve funkcionálním programování
« Odpověď #173 kdy: 20. 04. 2018, 23:40:30 »
endofunktor je nóbl výraz pro funkce
Není.
To mi vůbec neva.

Re:Nový objev ve funkcionálním programování
« Odpověď #174 kdy: 20. 04. 2018, 23:46:41 »
To mi vůbec neva.
Myslím, že by ti vůbec nemuselo vadit ani kdybys vůbec nevěděl, že nějakej endofunktor existuje, beztak je to much ado about nothing ;)

Re:Nový objev ve funkcionálním programování
« Odpověď #175 kdy: 20. 04. 2018, 23:52:15 »
Takže "v" nekomunikuje. Hm, tak to byl hodně smutný příběh s ještě smutnějším koncem :(

Tak just for record (kdyby to tady náhodou taky četl ještě někdo jiný, koho by zajímalo to původní téma):

Hlavní fígl monády oproti normálnímu řetězení normálních funkcí je, že se dají řetězit funkce, které přijímají parametr z "normálního světa" ("normálních hodnot"), ale vrací hodnotu "z jiného světa". Problém toho příkladu v PHP, u kterého Smutný příběh začal, je, že parametr i výsledná hodnota jsou "z normálního světa". To mě hnedka trklo a nezdálo se mi to. Ten příklad prostě podle mě nevystihuje to hlavní, o co v tom všem jde. Každá z těch zřetězených funkcí totiž musí "skákat nahoru", do toho jiného ("vyššího") světa, takže to zřetězení pak vlastně "skáče nahoru a dolů", přimž je zajímavé, že uvnitř jazyka jde skočit jenom nahoru. Skokem dolů se totiž realizuje ten "nečistý" efekt, který v jazyce jako takovém nechceme. Zajímavé a elegantní. Snadno pochopitelné na příkladě Promise z JS, který dělá přesně to samé.

No a je otázka, jak chceme to, co ta "funkce z normálního světa do jiného světa" dělá, nazývat. Pokud jí budeme říkat "funkce z kategorie C do kategorie F(C), kde F je endofunktor takový, že [bla bla bla]", tak to nikomu nic neřekne. Onanie dobrá, ale do diskuse k ničemu.

Když se něco posunuje na nějakou vyšší úroveň, tak se tomu často říká "lift" (může to znamenat různé věci v různých kontextech, ale společné to má ten "skok do vyššího světa"), takže mě, blbce starýho, po ránu nenapadlo napsat nic jinýho, než že ta funkce "liftuje", což nebylo vůbec šťastný, protože mě mohlo napadnout, že člověk, který zná Haskell, si pod tím slovem představuje něco dost konkrétního.

No a to je všechno. S normálním člověkem(TM) by to probíhalo asi takhle:

Normální člověk: Hele, nazývat to "liftuje" mi nepřijde dvakrát šťastný. Pod tím by si někdo mohl představit, že tam probíhá přesně to, co v liftA, liftM atd.

Já: No jo, máš pravdu, su piča stará zbrklá, jak tomu teda budem říkat? Existuje pro to nějakej název?

Zbytek Smutného příběhu už je jenom o tom, že mě zajímalo, jak moc namistrovanej "v" je a jestli má být na co. Potvrdilo se, čeho jsem se obával a co jsem tušil... Je fakt zajímavý, že tohle pozoruju převážně u anonymů...
« Poslední změna: 20. 04. 2018, 23:54:59 od Mirek Prýmek »

Re:Nový objev ve funkcionálním programování
« Odpověď #176 kdy: 21. 04. 2018, 00:13:21 »
Taky se mi líbilo "lift je operace která umožňuje aplikovat původní funkci v novém prostředí". To je inspirativní.
Jo. Ale chybí mi tam to nejzásadnější: za zachování struktury. "Aplikovat původní funkci v novém prostředí" bych mohl všelijak, že jo... Proto tam jsou ta pravidla, co "v" tak pěkně popsal - ta to garantují.

BoneFlute

  • *****
  • 2 083
    • Zobrazit profil
Re:Nový objev ve funkcionálním programování
« Odpověď #177 kdy: 21. 04. 2018, 00:20:45 »
Tak just for record (kdyby to tady náhodou taky četl ještě někdo jiný, koho by zajímalo to původní téma):
A to já si to počtu rád, je-li co.

Hlavní fígl monády oproti normálnímu řetězení normálních funkcí je, že se dají řetězit funkce, které přijímají parametr z "normálního světa" ("normálních hodnot"), ale vrací hodnotu "z jiného světa". Problém toho příkladu v PHP, u kterého Smutný příběh začal, je, že parametr i výsledná hodnota jsou "z normálního světa". To mě hnedka trklo a nezdálo se mi to. Ten příklad prostě podle mě nevystihuje to hlavní, o co v tom všem jde. Každá z těch zřetězených funkcí totiž musí "skákat nahoru", do toho jiného ("vyššího") světa, takže to zřetězení pak vlastně "skáče nahoru a dolů", přimž je zajímavé, že uvnitř jazyka jde skočit jenom nahoru. Skokem dolů se totiž realizuje ten "nečistý" efekt, který v jazyce jako takovém nechceme. Zajímavé a elegantní. Snadno pochopitelné na příkladě Promise z JS, který dělá přesně to samé.
Hezký.

Bezpečně chápu Promise a Maybe, hůř jsem na tom s IO. Takže to všechno prohodím, a budu uvažovat:

Mám funkci, která načte číslo ze souboru, pokud je sudé tak něco s tím spočte, pokud liché, něco jiného, a pak tu hodnotu zapíše zpět do souboru. A to celé třikrát, ať to pěkně vynikne.
Jsem v té funkci. Jeden kontext. Když chci načítat ze souboru, tak to nejde, protože soubor nepatří do mého "světa", nejde předat argumentem (tak čtení by snad na humpoláka šlo, ale zápis už ne). Takže nemůžu použít normální pure funkci. Uvožováním ala Promise to celé obrátím a řeknu: "hele, sežeň mi soubor já si z něho načtu hodnotu, něco spočtu, a pak do něj zase zapíšu." - toto je funkce f1. A to celé třikrát. Následně se celý tento recepis vezme, a nějaký interpret to přečte a musí sehnat ten soubor, a musí provést skutečné zápisy mezi funkcí f1, a f2 a f3.

A celé se to vymejšlí kůli tomu, aby se ověřilo, že: za předpokladu, že splníme všechny deklarované požadavky (načtení a zápis a synchronizaci souborů), bude to fungovat, protože to lze zaručit. Tedy oddělení zaručitelných (pure) a nezaručitelných věcí.

A jestli se alespoň trochu chytám, tak ten lift je ta část, kdy ta funkce předává roli tomu interpretu, tak? Nebo jinak?

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Nový objev ve funkcionálním programování
« Odpověď #178 kdy: 21. 04. 2018, 00:31:11 »
No a je otázka, jak chceme to, co ta "funkce z normálního světa do jiného světa" dělá, nazývat. Pokud jí budeme říkat "funkce z kategorie C do kategorie F(C), kde F je endofunktor takový, že [bla bla bla]", tak to nikomu nic neřekne. Onanie dobrá, ale do diskuse k ničemu.
To je ale zase nesmysl, funkce nemůže být z kategorie do kategorie a navíc endofunktor má ve jménu “endo”, protože operuje v rámci jedné kategorie. To je fakt jak diskuse s placatozemcem  ::)

Re:Nový objev ve funkcionálním programování
« Odpověď #179 kdy: 21. 04. 2018, 00:37:02 »
tak čtení by snad na humpoláka šlo
Nešlo, protože to je efekt. Do toho souboru ti třeba paralelně někdo jinej zapisuje, ty bys pokaždé přečetl jiný číslo a vrátil ho. Tím by se ti ta celá čistota a lazyness rozbila :)

Proto taky nejde bez IO random.

, ale zápis už ne). Takže nemůžu použít normální pure funkci. Uvožováním ala Promise to celé obrátím a řeknu: "hele, sežeň mi soubor já si z něho načtu hodnotu, něco spočtu, a pak do něj zase zapíšu." - toto je funkce f1. A to celé třikrát. Následně se celý tento recepis vezme, a nějaký interpret to přečte a musí sehnat ten soubor, a musí provést skutečné zápisy mezi funkcí f1, a f2 a f3.

A celé se to vymejšlí kůli tomu, aby se ověřilo, že: za předpokladu, že splníme všechny deklarované požadavky (načtení a zápis a synchronizaci souborů), bude to fungovat, protože to lze zaručit. Tedy oddělení zaručitelných (pure) a nezaručitelných věcí.
Mně přijde, že tam hledáš zbytečný složitosti. Je to fakt jednoduchý: když máš Promise, tak to znamená, že tu hodnotu získáš "někdy" - tj. nemůžeš ji z toho Promisu hned dostat, když se ti zamane. Jediný, co můžeš, je dát mu callback, kterej se má spustit, ta hodnota bude k dispozici. A ten callback ti zase vrátí nějakou hodnotu - a bylo by fajn, kdyby ji taky mohl vrátit "až někdy". No takže máš takový řetěz callbacků a nějakým způsobem ("někde jinde") vošéfováváš, kdy se má který spustit. Ale každopádně se spustí ve správném pořadí, protože chca nechca na sebe musí čekat přesně v tom pořadí, v jakém je zřetězíš.

To je celý, nic víc tam nehledej :)

Ta šaráda s bindem je tam pak víceméně jenom proto, abys ty "callbacky" mohl psát "za sebe" a nemusel je vnořovat. Znáš to: v JS byl dřív callback hell a teď se to hezky napíše jako promise.then(...).then(...).then(...). Ten "then", to je právě přesně bind.

Pokud chceš, můžeš IO psát i v Haskellu bez monády, ale pak to právě musíš vnořovat - úplně přesně jako v JS. Haskell je vlastně vůbec takový JS, nevím, co s tím pořád kdo dělá za vědu :)))

A jestli se alespoň trochu chytám, tak ten lift je ta část, kdy ta funkce předává roli tomu interpretu, tak? Nebo jinak?
No... takhle bych to asi nenapsal, protože mi to přijde trochu zavádějící, ale myslíš to asi dobře. Fígl je v tom, že ten "callback" (neříkejme tomu lift, je to fakt pitomina) vrací jakoby "zabalenou hodnotu", kterou může "rozbalit" a předat do dalšího callbacku jenom runtime - ty to v jazyce udělat nemůžeš.