Funkcionální programátor

JSH

Re:Funkcionální programátor
« Odpověď #75 kdy: 29. 06. 2015, 17:30:31 »
... prosím, přečti si něco o těch metodách co jsem napsal, pochop je, zamysli se nad nimi, a pak zjistíš, že tato otázka a vlastně všechny v tomto vlákně jsou jasné.
Ano, čtu si, přemýšlím, nechápu.

Všechny ukázky unique typingu jako by z oka vypadly vnitřnostem IO monády. Snažil jsem se zjistit, jak se v Cleanu nebo v Mercury řeší vlákna. Chtěl jsem si porovnat Haskellovské problémy s IORef se stavem v Cleanu ale nic jsem nenašel. Vypadá to, že tam mám k dispozici jen skrytý thread pool a alternativu 'par'.

Pokud v Haskellu zakážu forkIO a pár dalších, tak mám taky vyřešené vedlejší efekty. Co mi uchází?


v

Re:Funkcionální programátor
« Odpověď #76 kdy: 29. 06. 2015, 17:33:32 »
Vypadá to, že tam mám k dispozici jen skrytý thread pool a alternativu 'par'.
odkazy?

pár dalších
jméno té funkce je lepší ani nevyslovovat, i když je užitečná :D

čumil

Re:Funkcionální programátor
« Odpověď #77 kdy: 29. 06. 2015, 17:34:25 »
Jo ... můžu.
Ve zkratce. Uniqueness typing přidává do hry parametr času, není to moc vidět ale je to tak. V Haskellu parametr času není. Takže. Pokud máme objekt svět, pak v Haskellu nad tím jedním jedním objektem svět můžeme zavolat plno IO funkcí v různých vláknech, ty funkce vrátí svoje nové objekty svět a tak dál. Ve výsledku máme strašně moc objektů svět v jednu chvíli, a v různých vláknech. A tadá, race condition a nečistota.

tak má Clean vlákna nebo nemá? je nesmyslné takto porovnávat jazyk s vlákny a bez nich

máme li objekt world, pak operace IO bere tento objekt world, a vrací nový, ale ten starý není možné použit více, reference se po jednom použití stala neplatnou, protože kdyby ne, začalo by na objekt ukazovat více referencí. Tím je zajištěna čistota, protože poté i IO funkce se stejnými argumenty vrátí stejný výsledek opakovaně
tohle je prakticky popis IO monády, po provední vstupu/výstupu je starý "svět" již nedostupný a tudíž ho neleze znovu "použít"
Netuším

lež! A už sem ti dokonce i vysvětlil nohoře jak funguje IO monáda! Aspoň si to přečti a zamysli se nad tím. Právě že ten starý svět lze použít opakovaně. A ve více vláknech.

čumil

Re:Funkcionální programátor
« Odpověď #78 kdy: 29. 06. 2015, 17:36:35 »
... prosím, přečti si něco o těch metodách co jsem napsal, pochop je, zamysli se nad nimi, a pak zjistíš, že tato otázka a vlastně všechny v tomto vlákně jsou jasné.
Ano, čtu si, přemýšlím, nechápu.

Všechny ukázky unique typingu jako by z oka vypadly vnitřnostem IO monády. Snažil jsem se zjistit, jak se v Cleanu nebo v Mercury řeší vlákna. Chtěl jsem si porovnat Haskellovské problémy s IORef se stavem v Cleanu ale nic jsem nenašel. Vypadá to, že tam mám k dispozici jen skrytý thread pool a alternativu 'par'.

Pokud v Haskellu zakážu forkIO a pár dalších, tak mám taky vyřešené vedlejší efekty. Co mi uchází?
Uchází ti, že v Haskellu může v jednu chvíli být neomezené množství světů najednou, kdežto v Cleanu pouze jeden.

čumil

Re:Funkcionální programátor
« Odpověď #79 kdy: 29. 06. 2015, 17:38:42 »
A díky jednomu jedinému světu je udržena časová konzistence a splněna referenční transparentnost.


Kolemjdoucí

Re:Funkcionální programátor
« Odpověď #80 kdy: 29. 06. 2015, 17:38:48 »
No, dívejme se na to pozitivně – místo odsuzování za to, že jste absolutně nepochopil pojem „zpráva” v objektově orientovaném jazyce a pod tím pojmem si dovedete představit jen zprávu IPC

Naopak pochopil jsem to zcela jasně, objekt dle Kaye dostane zprávu a sám se rozhodne zda a jakou svoji metodu zavolá. U sousedů se tomuto mechanismu říká IPC, funkčnost je velmi blízká.
Naopak nepochopení je žít v bludu, že zasílání zpráv je jiný název pro volání metod s pozdní vazbou.

Tím bych to ze své strany uzavřel a doporučil Vám nějakou učebnici úplných základů objektově orientovaného programování, nejlépe od nějakého autora z prostředí otců-zakladatelů toho pojmu.

Doporučuji nastudovat myšlenky zmíněného Kaye, zatím jste ani nezačal.

JSH

Re:Funkcionální programátor
« Odpověď #81 kdy: 29. 06. 2015, 17:43:39 »
odkazy?
V dokumentaci Cleanu jsem nenašel lautr nic a googlit se to nedá. U mercury jsem našel https://github.com/Mercury-Language/discussions/blob/master/parallelism_and_java/2013-10-23_thread-pools.txt což jsem si interpretoval jako 'par'. Nic lepšího jsem nenašel.
Haskellu zakážu forkIO a pár dalších, tak mám taky vyřešené vedlejší efekty. Co mi uchází?
Uchází ti, že v Haskellu může v jednu chvíli být neomezené množství světů najednou, kdežto v Cleanu pouze jeden.
Proto se tu furt dokola ptáme jestli clean umí vlákna. Pokud v Haskellu zakážeme forkIO tak je taky jenom jediný svět. Paralelismus jen přes spark pool umí Haskell taky.

To rozdvojení světa kvůli vláknům není vlastnost monádů. Je to tím, že existuje funkce forkIO, která ty monády obejde.

v

Re:Funkcionální programátor
« Odpověď #82 kdy: 29. 06. 2015, 17:43:57 »
Jo ... můžu.
Ve zkratce. Uniqueness typing přidává do hry parametr času, není to moc vidět ale je to tak. V Haskellu parametr času není. Takže. Pokud máme objekt svět, pak v Haskellu nad tím jedním jedním objektem svět můžeme zavolat plno IO funkcí v různých vláknech, ty funkce vrátí svoje nové objekty svět a tak dál. Ve výsledku máme strašně moc objektů svět v jednu chvíli, a v různých vláknech. A tadá, race condition a nečistota.

tak má Clean vlákna nebo nemá? je nesmyslné takto porovnávat jazyk s vlákny a bez nich

máme li objekt world, pak operace IO bere tento objekt world, a vrací nový, ale ten starý není možné použit více, reference se po jednom použití stala neplatnou, protože kdyby ne, začalo by na objekt ukazovat více referencí. Tím je zajištěna čistota, protože poté i IO funkce se stejnými argumenty vrátí stejný výsledek opakovaně
tohle je prakticky popis IO monády, po provední vstupu/výstupu je starý "svět" již nedostupný a tudíž ho neleze znovu "použít"
Netuším

lež! A už sem ti dokonce i vysvětlil nohoře jak funguje IO monáda! Aspoň si to přečti a zamysli se nad tím. Právě že ten starý svět lze použít opakovaně. A ve více vláknech.

ale já vím jak funguje IO monáda, už pár let v Haskellu píšu

opravdu vám přijde vpořádku porovnávat situaci s jedním a více vlákny?

čumil

Re:Funkcionální programátor
« Odpověď #83 kdy: 29. 06. 2015, 17:51:08 »
Samozřejmě, když v Haskellu zakážeme "nečistá" vlákna a ponecháme pouze čistý paralelismus pomocí par, pak dosáhneme stejného efektu jako poskytuje uniqueness typing. Nevýhoda je ale taková, že IO je potřeba dělat ve více vláknech (slabost uniqueness typing ...). A také se tak děje. Díky možnosti použití nečistých vláken ztratil Haskell čistotu. Projevila se slabost IO monády.

čumil

Re:Funkcionální programátor
« Odpověď #84 kdy: 29. 06. 2015, 17:52:37 »
Řešením je reaktivita a nebo dosud nevyzkoušená komunikace pomocí lazy listů.

v

Re:Funkcionální programátor
« Odpověď #85 kdy: 29. 06. 2015, 17:57:45 »
Samozřejmě, když v Haskellu zakážeme "nečistá" vlákna a ponecháme pouze čistý paralelismus pomocí par, pak dosáhneme stejného efektu jako poskytuje uniqueness typing. Nevýhoda je ale taková, že IO je potřeba dělat ve více vláknech (slabost uniqueness typing ...). A také se tak děje. Díky možnosti použití nečistých vláken ztratil Haskell čistotu. Projevila se slabost IO monády.

IO monáda a vlákna jsou na sobě nezávislé věci, jazyk může podporovat vlákna a nemusí využívat IO monádu

takže to vypadá, že jsme se dobrali k závěru, že IO monáda a uniqness typing jsou v jednovláknovém prostředí čumilovsky ekvivalentní (ref. tr.) nebo se pletu?

čumil

Re:Funkcionální programátor
« Odpověď #86 kdy: 29. 06. 2015, 18:05:36 »
Samozřejmě, když v Haskellu zakážeme "nečistá" vlákna a ponecháme pouze čistý paralelismus pomocí par, pak dosáhneme stejného efektu jako poskytuje uniqueness typing. Nevýhoda je ale taková, že IO je potřeba dělat ve více vláknech (slabost uniqueness typing ...). A také se tak děje. Díky možnosti použití nečistých vláken ztratil Haskell čistotu. Projevila se slabost IO monády.

IO monáda a vlákna jsou na sobě nezávislé věci, jazyk může podporovat vlákna a nemusí využívat IO monádu

takže to vypadá, že jsme se dobrali k závěru, že IO monáda a uniqness typing jsou v jednovláknovém prostředí čumilovsky ekvivalentní (ref. tr.) nebo se pletu?
V jednovláknovém prostředí (ne, v jednovláknovém IO) jsou ekvivalentní. Uniqueness typing právě zabraňuje aby vedlejší efekty běželi ve více vláknech, což IO monáda nečiní. Takže ačkoli jsme se schodly, Haskell je nečistý.

čumil

Re:Funkcionální programátor
« Odpověď #87 kdy: 29. 06. 2015, 18:09:01 »
Aby to nebylo pochopeno blbě, myslel jsem v jednovláknovém IO systému, když neděláme operace nad v čase proměnnými objekty, můžeme bez obav nasadit tolik vláken, kolik jich máme.

JSH

Re:Funkcionální programátor
« Odpověď #88 kdy: 29. 06. 2015, 18:15:27 »
... nebo dosud nevyzkoušená komunikace pomocí lazy listů.
Ta nevyzkoušená komunikace pomocí lazy listů, co měla být Haskellu původně místo monádů? Nigel Perry ji ve své dizertaci rozebral celkem důkladně. Z představy toho datového typu se mi dělá kapku šoufl. A výsledkem by byl zase jednovláknový program seznam -> seznam. A kdyby se tam z praktických důvodů přidaly vlákna, jsou tam dvě nespojitelné funkce se stejnými problémy při synchronizaci jako mají monády.

JSH

Re:Funkcionální programátor
« Odpověď #89 kdy: 29. 06. 2015, 18:20:46 »
Aby to nebylo pochopeno blbě, myslel jsem v jednovláknovém IO systému, když neděláme operace nad v čase proměnnými objekty, můžeme bez obav nasadit tolik vláken, kolik jich máme.
Haskell bez forkIO? Vždyť to tvrdíme celou dobu. Jednovláknové IO bude OK i pomocí monádů. V praxi je prostě vícevláknové IO potřeba, tak holt máme funkci pomocí které dokážeme monády obejít a ten svět si forknout.