Funkcionální programátor

BoneFlute

  • *****
  • 2 047
    • Zobrazit profil
Re:Funkcionální programátor
« Odpověď #90 kdy: 29. 06. 2015, 18:23:25 »
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.

A uniqueness typing? Kdyby sis pořádně přečetl tu wiki, už by ti to bylo jasný. Uniqueness objekt může mít za svůj život pouze jednu jedinou referenci na sebe. Takže, 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ě, představ si to jako stroj času :). Nevýhoda je, že IO je možno realizovat pouze na jednom vlákně, a proto je mnohem lepší použít reaktivitu.

Díky za příspěvek. Sice si trochu praštěnej s tím věčným osočováním jak to dotyční nečtou a nechápou, ale jsou tu i jiní, ti jsou za polopatické vysvětlení rádi.


čumil

Re:Funkcionální programátor
« Odpověď #91 kdy: 29. 06. 2015, 18:27:16 »
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.
No, a právě ten fakt, že IO monáda nezabraňuje forknutí světa činí IO monádu nečistou. Takže doufám, prosím bohy, že jsem konečně dovedl pár zatoulaných duší na správnou funkcionální cestu.

Radek Miček

Re:Funkcionální programátor
« Odpověď #92 kdy: 29. 06. 2015, 18:29:43 »
Ta nevyzkoušená komunikace pomocí lazy listů, co měla být Haskellu původně místo monádů?

Někdy se tomu říká Landin-stream IO - idea z roku 1965 - viz IO monad realized in 1965. AFAIK používal to také jazyk Miranda.

čumil

Re:Funkcionální programátor
« Odpověď #93 kdy: 29. 06. 2015, 18:31:14 »
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.

A uniqueness typing? Kdyby sis pořádně přečetl tu wiki, už by ti to bylo jasný. Uniqueness objekt může mít za svůj život pouze jednu jedinou referenci na sebe. Takže, 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ě, představ si to jako stroj času :). Nevýhoda je, že IO je možno realizovat pouze na jednom vlákně, a proto je mnohem lepší použít reaktivitu.

Díky za příspěvek. Sice si trochu praštěnej s tím věčným osočováním jak to dotyční nečtou a nechápou, ale jsou tu i jiní, ti jsou za polopatické vysvětlení rádi.
Jo, asi sem praštěnej, ale ono to fakt tak je, plno lidí prostě rači ignoruje argumenty, než aby museli změnit chápaní dané věci. Je to ironie, ale cizinci jsou v tomhle strašní, ty fakt člověka ignorují a při zmínce impure Haskell tě naférovku pošlou do zadeke abys nevířil stojaté vody.

Jako tady lidi začali diskutovat a myslet trošku o tom, co sem říkal. Což je fajn. Ale už mi to ignorování trošku vlezlo na mozek mno.

JSH

Re:Funkcionální programátor
« Odpověď #94 kdy: 29. 06. 2015, 18:32:15 »
No, a právě ten fakt, že IO monáda nezabraňuje forknutí světa činí IO monádu nečistou. Takže doufám, prosím bohy, že jsem konečně dovedl pár zatoulaných duší na správnou funkcionální cestu.
IO monáda forknutí světa zabraňuje. A proto, že je z praktických důvodů občas potřeba svět forknout, tak se přidaly funkce jako forkIO, které obejdou tu monádu a ten svět forknou.
Jestli se Clean začne víc používat, tak se tam stejným způsobem přidá funkce, co obejde ten unique svět a forkne ho. Proč? Protože je to občas potřeba.


Radek Miček

Re:Funkcionální programátor
« Odpověď #95 kdy: 29. 06. 2015, 18:36:25 »
Nigel Perry ji ve své dizertaci rozebral celkem důkladně.

Tu jsem neznal, díky. Také lze doporučit dizertaci Andrew Donalda Gordona Functional Programming and Input/Output.

čumil

Re:Funkcionální programátor
« Odpověď #96 kdy: 29. 06. 2015, 18:39:01 »
Ta nevyzkoušená komunikace pomocí lazy listů, co měla být Haskellu původně místo monádů?

Někdy se tomu říká Landin-stream IO - idea z roku 1965 - viz IO monad realized in 1965. AFAIK používal to také jazyk Miranda.
wow, tak o tom sem nevěděl, že už to bylo nasazeno. Tendle nápad sem našel pod nějakým blogem s kritikou Haskellu, a toho nebožáka tam pak začal dav kamenovat, a vida, jeho nápad to originálně nebyl. Kamenovali špatnýho. Nezbývá než to uzavřít tak, že Haskell si prostě zvolil good enough cestu, žádné experimenty s čistotou, žádné optimisitic evaluation (až 30% speedup oproti lazy evaluation, což je WOW). Jediné co mi vadí je, že jeho autoři lžou a šíří dezinformaci. Jinak je to pěkný jazyk.

čumil

Re:Funkcionální programátor
« Odpověď #97 kdy: 29. 06. 2015, 18:43:12 »
No, a právě ten fakt, že IO monáda nezabraňuje forknutí světa činí IO monádu nečistou. Takže doufám, prosím bohy, že jsem konečně dovedl pár zatoulaných duší na správnou funkcionální cestu.
IO monáda forknutí světa zabraňuje. A proto, že je z praktických důvodů občas potřeba svět forknout, tak se přidaly funkce jako forkIO, které obejdou tu monádu a ten svět forknou.
Jestli se Clean začne víc používat, tak se tam stejným způsobem přidá funkce, co obejde ten unique svět a forkne ho. Proč? Protože je to občas potřeba.
Pokud v Cleanu bude svět forknut, přestane být uniqueness typovaný a bude porušena jeho syntaktická integrita. Kdežto IO monáda je IO monádou i když je forknutá, žádné porušení systému se nekoná.

v

Re:Funkcionální programátor
« Odpověď #98 kdy: 29. 06. 2015, 18:44:32 »
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ý.

já se asi začínám ztrácet, Haskell není čistý protože může mít vlákna?

čumil

Re:Funkcionální programátor
« Odpověď #99 kdy: 29. 06. 2015, 18:45:44 »
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ý.

já se asi začínám ztrácet, Haskell není čistý protože může mít vlákna?
Protože může forknout IO monádu, respektive, že IO monáda něčemu takovému nezabraňuje jako v případě uniqueness typování.

v

Re:Funkcionální programátor
« Odpověď #100 kdy: 29. 06. 2015, 18:46:54 »
a teď mě ještě napadlo jestli jde (pouze) s uniqness typing vynutit, že funkce neprovádí vstup/výstup, specificky v Haskellu s jeho typovým systémem to jde

JSH

Re:Funkcionální programátor
« Odpověď #101 kdy: 29. 06. 2015, 18:50:28 »
Pokud v Cleanu bude svět forknut, přestane být uniqueness typovaný a bude porušena jeho syntaktická integrita. Kdežto IO monáda je IO monádou i když je forknutá, žádné porušení systému se nekoná.
Ne. Z pohledu typového systému to budou dva nezávislé unikátní objekty a zodpovědnost za synchronizaci přejde na programátora. Prostě se z praktických důvodů obejde omezení typovým systémem úplně stejně jako se obešlo u Haskellu.

Inkvizitor

Re:Funkcionální programátor
« Odpověď #102 kdy: 29. 06. 2015, 18:53:31 »
No, a právě ten fakt, že IO monáda nezabraňuje forknutí světa činí IO monádu nečistou. Takže doufám, prosím bohy, že jsem konečně dovedl pár zatoulaných duší na správnou funkcionální cestu.
IO monáda forknutí světa zabraňuje. A proto, že je z praktických důvodů občas potřeba svět forknout, tak se přidaly funkce jako forkIO, které obejdou tu monádu a ten svět forknou.
Jestli se Clean začne víc používat, tak se tam stejným způsobem přidá funkce, co obejde ten unique svět a forkne ho. Proč? Protože je to občas potřeba.

Asi mi něco uniká, ale nedá mi, abych se nezeptal - není svět "forknutý" jaksi sám o sobě, respektive není hlavní problém v tom, že se po tom samém světě potulují různé entity, které svou přítomností ten společný svět mění? A pokud ano, není vlastně jedno, zda do světa, který je z důvodu přístupu ostatních entit nepredikovatelný a není možné si ho označkovat časem a očekávat po IO akci deterministický stav v čase t+1, přistupuje n entit nebo n+1, přičemž ta +1 je forknutá původní entita našeho programu napsaného v Haskellu?

JSH

Re:Funkcionální programátor
« Odpověď #103 kdy: 29. 06. 2015, 18:55:19 »
Protože může forknout IO monádu, respektive, že IO monáda něčemu takovému nezabraňuje jako v případě uniqueness typování.
Tak znova. IO monáda forknutí brání. Proto tam kua taky je. To forknutí se dělá tak, že se ta monáda obejde. Je to tak těžké pochopit???

Jo, mohli bychom říct "tohle už není monáda, byla porušena integrita", ale k čemu by to bylo?

čumil

Re:Funkcionální programátor
« Odpověď #104 kdy: 29. 06. 2015, 18:58:11 »
Pokud v Cleanu bude svět forknut, přestane být uniqueness typovaný a bude porušena jeho syntaktická integrita. Kdežto IO monáda je IO monádou i když je forknutá, žádné porušení systému se nekoná.
Ne. Z pohledu typového systému to budou dva nezávislé unikátní objekty a zodpovědnost za synchronizaci přejde na programátora. Prostě se z praktických důvodů obejde omezení typovým systémem úplně stejně jako se obešlo u Haskellu.
Ne a ne, přečti si pozorně dokumentaci Cleanu ohledně uniqueness typů, uniqueness typing je čisté právě tím, že zabraňuje ochcání, ničím jiným.