Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Mirek Prýmek

Stran: 1 ... 265 266 [267] 268 269 ... 618
3991
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 01:10:40 »
Takže, chci vysvětlení jak to že je možné v Haskellu 1:1 namapovat kód v Cčku i se všemi měnitelnými proměnnými a funkcemi do IO monády a tento kód se chová stejně jako kód v Cčku. Pokud trváte na tom že je to čistý kód, pak i samotné Cčko je čisté, stačí mu skutečně jen přidat ty monády a tvrdit to samé co u Haskellu.
Není to možné a ten kód se NECHOVÁ stejně.

Kód A:
Kód: [Vybrat]
int a = random();
int b = random();

(pseudo)kód B:
Kód: [Vybrat]
a <- random
b <- random

To, že A a B vypadá na pohled stejně, vůbec nic neznamená. Význam toho kódu je úplně jiný. Ten první kód dvakrát volá tutéž fci, ten druhý kód ve skutečnosti vytváří jakési lambdy, ty jaksi skládá za sebe pomocí jakéhosi fakového RealWorld.

V Haskellu prostě platí, že když dvakrát zavolám tutéž ***FUNKCI*** dvakrát, vrátí mi vždy to samé. "a <- random" ***NENí*** volání funkce. I kdyby tak ta syntaxe klidně stokrát vypadala. Není. Není a není. Tečka.

:)))

3992
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 01:06:09 »
Jenže stále to neřeší ten problém. Stavím na tom, že substituce výrazů je podmínka pro označení jazyka za (pure) funkcionální. Tím, že jsi to zakázal befelem, jsi tu substituci neumožnil.
Říkám, že v čistém jazyce nemůžeš při dvou volání stejné fce se stejnými argumenty dostat něco jiného. Pokud by runIO existovalo, tak prostě uděláš dvakrát po sobě "runIO a" a pokaždé dostaneš něco jiného. Takže:

jazyk je čistý -> v jazyce nemůže existovat runIO

...ne naopak!

3993
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 00:56:07 »
Musím nesouhlasit. Vyzkoušel jste si FRP? Porovnávat IO monádu a FRP je silně podivné i pro začátečníka jako jsem já. FRP nezná měnitelný stav. Není tam nikde, stejně jako vedlejší efekty, a podle toho vypadá a chová se i kód. Neexistuje tam nic jako měnitelná reference, a ani něco takového není třeba. IO monáda a FRP je něco naprosto kategoricky odlišného. Toto už je za hranicí, to už cítím jako demagogie.
Ale monáda taky nic nemění, ani IO monáda. Říkám, máš to o pár příspěvků výš:

"Ona je to maskovaná funkce World -> (a, World)"

- vidíš to? Vezmu svět, aplikuju na něj něco, mám nový svět. Na nový svět opět aplikuju něco atd. Pořád ti to nepřijde podobné streamům? Neříkám, že je to totéž, ale ten způsob je velmi podobný. Akorátže u monád to máš celé zabalené do syntaktického cukru, aby to vypadalo rádobyimperativně.

O tom jsem mluvil. Není to možné prostě proto, že IO není deterministické, neboli čisté.
Ne. Není to možné přesně z opačného důvodu, kdyby taková funkce existovala, tak potom by to čisté nebylo. Teď to čisté je.

Ale je

random :: IO Int
random = ...

úplně to samé. A teď budeme tvrdit, že v Cčku random() vrátí jen lambdu kterou interpretuje runtime.
Není ani trochu. Protože IO Int není Int. Z IO Int nikdy Int nedostaneš, což je přesně to, co ti říkám výš.

Proč musím? Proč je to tak správně? A proč to znamená, že když by to bylo možné, tak by Haskell čistý nebyl?

Kód: [Vybrat]
unpackMonad :: Maybe Int -> Int
unpackMonad Nothing = 0
unpackMonad Maybe i = i

No protože pokud by tohle šlo udělat s IO monádou, tak bys právě dostal různé hodnoty pro různá volání funkce, a to prostě nesmíš dostat :)

U Maybe to nevadí, protože tam je předem jasné, co uvnitř je, a nemůže to být chvilku takhle a chvilku jinak.

3994
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 00:45:49 »
IO Num
Vlastně Num by musel být constraint, ale tak rozumíme si že jo ;)

3995
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 00:44:55 »
Tu logiku nechápu. Proč bych se nemohl monády zbavit? Maybe, nebo Either se zbavit lze. Jak vzniká souvislost, že: "kdyby to bylo možné, pak by Haskell čistý nebyl. Možné to není a Haskell čistý je."? Naopak mě přijde, že díky tomu, že IOMonádu nelze substituovat, tak to znamená, že není čistá.
Pokud máš někde proměnnou "a" typu IO Num, tak nemůžeš provést něco jako "runIO a", dostat z ní ten integer a dál pokračovat čistě jenom s integerem. Vždycky musíš začít v IO monádě (main fce) - z ní můžeš tímpádem mít větve, které taky provádí IO. Nemůžeš ale IO větev naroubovat na ne-IO větev. Aspoň myslím teda ;)

3996
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 00:39:32 »
Ale kdepak. Prostě C je čistě funkcionální, a jakákoli funkce která má vedlejší efekty je ve výsledku jen lambda, kterou interpretuje runtime. Všechno je krásně čisté. Ještě potřebujeme ty monády, aby to mělo všechny náležitosti.
C není čistý, protože když dvakrát po sobě zavolám random(), vrátí mi pokaždé jinou hodnotu. V Haskellu nic takového není možné a proto je čistý.

To, že "a <- get" VYPADÁ jako volání funkce, na tom nic nemění, protože to volání fce NENÍ.

3997
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 00:34:55 »
Stav je ve FRP uchován ve zpětných signálních vazbách. Neměnní se, pokaždé se vytvoří jeho modifikovaná kopie, a pošle se signálem dál.
Což je přesně tentýž princip jako mají monády, máš to o asi tři příspěvky výš ;) Akorát teda samotné IO žádný stav nepřenáší, ale kdybys chtěl, můžeš si ho tam dát.

3998
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 00:16:43 »
Mirek Prýmek :
Podle https://wiki.haskell.org/IO_inside je tam fake typ RealWorld, který ale překladač nakonec vyhodí protože odpovídá (). Před časem jsem ho ve zdrojácích i našel, ale teď si nepamatuju přesně kde. Bude někde kolem ST monády, nebo bych aspoň začal hledat od stToIO.
Jj, to je ono. Nepředává se tam world ve smyslu nějakých dat, ale jenom se záměrně vytváří nový typ.


3999
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 08. 07. 2015, 00:16:34 »
To mne připadá padlé na hlavu. Proti takové argumentaci nemám co říct. Přesně podobné řeči nováčky matou, a zmatou je tak, až radši funkcionální programování zahodí.
Tak teď ti teda vůbec nerozumím. Pouštíš se do silných tvrzení ("Haskell není čistý!") a když se snažím povídavě, ne-rigorozně ukázat, proč čistý je, tak se ti to nelíbí, že to nováčky mate... No tak pokud to nováčky mate, tak nemají vydávat silná prohlášení :) Vždyť pořád si jenom tak neformálně kloužeme po povrchu, nikdo tady ještě nezačal ani podávat nějaké důkazy vlastností funktorů nebo přirozených transformací ;)

Vaše argumenty lze po mírné modifikaci nasadit na jakýkoli jazyk, a poté tvrdit že je čistý. Stačí jen vytvořit monády. což není problém.
Ale vůbec ne. Platí tohle:

pokud je jazyk čistý -> musím IO nějak obchcat, třeba pomocí monád

NEplatí tohle:

pokud má jazyk monády -> je čistý

Čistota je vlastnost jazyka jako celku, s monádami to nemá co dělat, monády jsou jenom nástroj.

4000
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 07. 07. 2015, 23:55:25 »
Mně pro pochopení pomohlo hlavně vykuchání IO a.
Mně pomohly tyhle slajdy: http://www.slideshare.net/ScottWlaschin/fp-patterns-buildstufflt - od slajdu 136. Analogie s kolejemi je báječně srozumitelná.

Ona je to maskovaná funkce World -> (a, World) i když možná je to teď implementované nějak jinak.
On se tam ale žádný "world" skutečně nepředává, ne? Měl jsem za to, že to je jenom z důvodu typového odlišení, jakobych udělal třeba a -> [a] a tím dostal nový typ, který mi vynutí to správné poskládání fcí za sebe.

4001
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 07. 07. 2015, 23:23:53 »
Pokud je IO monáda čistá, lze udělat následující strukturu kódu
Sorry, ale tomu zápisu nerozumím, nevím, co jsou ty čáry atd. Nešlo by ukázat normální kód, který se v Haskellu nepřeloží?

Neexisuje něco jako runIO protože runIO nelze nahradit svým výstupem.
Tady se už dostávám na tenkej led, takže opět doufám, že to někdo případně opraví: nejde to právě proto, že ty potřebuješ IO vzít a vrátit ho runtimu jako návrat funkce main. V jazyku samotném prostě tu datovou strukturu popisující IO nemůžeš spustit. To je přesně ta moje pointa.

Můžeš tu monádu předávat celým program a vyplivnout ji do main, ale nemůžeš se jí uprostřed programu "zbavit" = "spustit ji" - a to právě proto, že kdyby to bylo možné, pak by Haskell čistý nebyl. Možné to není a Haskell čistý je.

A druhá otázka, pokud je IO monáda čistá, proč ji nemůžeme zparalelizovat pomocí par?  Neměl by to být problém ne? Ale v Haskellu to nejde. Par ignoruje IO monádu.
Tohle už je na mě moc implementačně-specifická otázka, do té se raději pouštět nebudu, nejsem praktický haskeller.

4002
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 07. 07. 2015, 22:56:50 »
Vytvořit lambdu která volá Cčkovskou funkci není čisté, a rozhodně o nic víc než zavolání té funkce rovnou. A runtimu se nic nepředává, runtime Haskellu nemá žádný modul pro IO. A i kdyby se předávalo, na faktu že v čistém jazyce píšeme kód s vedlejšími efekty se nic nezmění.
Ještě jednou: ve funkci main jenom vytvoříš datovou strukturu, která popisuje nějaký sled akcí. Pokud generování datové struktury "není čisté", tak už fakt nevím, co by mělo být čisté...

Čistotu IO monády jsem začal zpochybňovat od té doby, co jsem ji začal používat i k něčemu složitějšímu než čtení a zapisování do konzole. Ačkoli, já jsem ji nezačal zpochybňovat, já jsem se snažil zoufale pochopit jak to může být funkcionální. Řešení je prosté, není. A rozepsání nic nemění. Po rozepsání to sice nebude vypadat jak kód v Cčku, ale chovat se bude stejně.
Ale jistěže to je funkcionální, v tom nejstriktnějším možném slova smyslu. Pokud tomu nevěříš, tak si to asi budeš muset nastudovat do hloubky včetně teorie kategorií, kde to uvidíš jasně a důkaz tam budeš mít rigorozní.

Pokud máš pocit, že "to funkcionální není", tak ty důvody rozepiš formálně: podej definici "funkcionální" a ukaž, který z bodů to podle tebe nesplňuje. Skoro bych řekl, že by ti mělo být předem jasné, že nemáš šanci uspět, protože za touhle celou strukturou jsou mozky, které fakt nedělají nějaké hloupé chyby...

4003
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 07. 07. 2015, 22:27:02 »
když vyjdu z čumilovy definice monády tak to jsou dvě volání stejné funkce se stejnými argumenty v pozměněném prostředí
Tady o žádnou čumilovu definici nejde. Význam symbolu "<-" je jasně definovaný, čumil nečumil ;) A dvoje volání téže funkce se stejnými parametry to prostě není.

4004
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 07. 07. 2015, 22:25:12 »
Neříká co chce, jen přes wrapper přímo volá Cčkovské funkce.
No a to právě AFAIK není pravda. Z té funkce, která dělá IO (např. main) prostě vypadnou ty lambdy. Ty v kódu NEvoláš céčkovské funkce, ale vytváříš lambdy, které předáš runtimu.

(pokud se mýlím, doufám, že mě zkušenější kolegové poopraví)

Ale pro mne by to nic nezměnilo, jakožto uživatel se budu potýkat se stejnými problémy jako doteď.
Monády dělají jenom iluzi imperativního kódu. Všechno je to jenom syntaktický cukr. Třeba "return" není žádný return. Kdyby sis místo do blocku to celé rozepsal do těch lambd, tak by tě to třeba tak nedráždilo a tu čistotu byz nezpochybňoval, protože bys ji tam měl jak na talíři :)

4005
Studium a uplatnění / Re:Funkcionální programátor
« kdy: 07. 07. 2015, 22:14:45 »
vypíše (0,1), tj. get vrátí pokaždé jinou hodnotu, přesto je f čistá funkce, čarodějnictví?!
Ovšem to "a <- get" není, pokud se nepletu, normální volání normální funkce. Takže to "různá volání stejné funkce vrátí jinou hodnotu" je přinejmenším zavádějící.

Teď si z hlavy nevybavím, jak to tam přesně je, ale v principu to bude syntaktický cukr pro dvoje volání nějaké lambdy s různými parametry.

Stran: 1 ... 265 266 [267] 268 269 ... 618