Má Haskell budoucnost?

Re:Má Haskell budoucnost?
« Odpověď #360 kdy: 17. 05. 2016, 21:00:59 »
Ale to není monadické řetězení. Neřetězí se ti ST akce, řetězí se ti aplikace funkce, ale ta nemá s ST vůbec nic společného. Řetězením v monadu rozumím například to, že když asociuješ tu >>= operaci opačně, tak to pak má třeba kvadratickou složitost apod.
Ok, nechme to být, to by asi bylo na dlouho si vyjasnit, co kdo čím myslel :)


Re:Má Haskell budoucnost?
« Odpověď #361 kdy: 17. 05. 2016, 21:36:09 »
Citace
Prostě bavili jsme se o tom, že v rámci STM se neděje* žádná tajemná nečistá inplace magie.
No ten STRef je v implementaci fakt normální mutable proměnná, akorát že ukazuje na thunk, čili může obsahovat výpočet. Jestli je schopne to při dostatečné striktnosti kompiler nějak vyoptimalizovat pryč, to netuším.
Pokud bylo v proměnné x, tak (modifySTRef ref f) vytváří akci, která do ní zapisuje f(x). Proto když se to udělá mockrát za sebou, tak mi tam ten stack narůstá. Viz zdroják:

Kód: [Vybrat]
modifySTRef ref f = writeSTRef ref . f =<< readSTRef ref

Oproti tomu čárkovaná verze udělá to, že vytvoří akci, která zapíše přímo hodnotu f(x):

Kód: [Vybrat]
modifySTRef' ref f = do
    x <- readSTRef ref
    let x' = f x
    x' `seq` writeSTRef ref x'

Že se tam neděje žádná nečistá magie myslím v tom smyslu, že je to stejně čisté jako IO - pořád se prostě operuje jenom se statickými akcemi, které jdou spustit jenom mimo jazyk samotný, stejně jako IO.

Re:Má Haskell budoucnost?
« Odpověď #362 kdy: 17. 05. 2016, 21:40:24 »
Oproti tomu čárkovaná verze udělá to, že vytvoří akci, která zapíše přímo hodnotu f(x):
Čili pokud to správně chápu, tak pokud bych měl fci f, která vyhodí výjimku, tak pokud udělám (modifySTRef ref f) a následně writeSTRef a readSTRef, tak se výjimka nevyhodí, zatímco kdybych použil modifySTRef', tak se vyhodí.
« Poslední změna: 17. 05. 2016, 21:43:03 od Mirek Prýmek »

andy

Re:Má Haskell budoucnost?
« Odpověď #363 kdy: 17. 05. 2016, 22:41:20 »
Oproti tomu čárkovaná verze udělá to, že vytvoří akci, která zapíše přímo hodnotu f(x):
Čili pokud to správně chápu, tak pokud bych měl fci f, která vyhodí výjimku, tak pokud udělám (modifySTRef ref f) a následně writeSTRef a readSTRef, tak se výjimka nevyhodí, zatímco kdybych použil modifySTRef', tak se vyhodí.
Ono ST je interně identické s IO a STRef je identický s IORef. Do obojího se ukládá Thunk, tzn. může být i nevykonaný.

A ano, jeden pohled, jak na to koukat je to, že v podstatě něco "interpretuje" ten ST/IO monad. A IMO je to rozumný pohled, pokud člověk zrovna neladí nějaké chyby v GHC :) GHC se samozřejmě snaží to kompilovat napřímo.

Re:Má Haskell budoucnost?
« Odpověď #364 kdy: 17. 05. 2016, 22:54:23 »
Čili pokud to správně chápu, tak pokud bych měl fci f, která vyhodí výjimku, tak pokud udělám (modifySTRef ref f) a následně writeSTRef a readSTRef, tak se výjimka nevyhodí, zatímco kdybych použil modifySTRef', tak se vyhodí.
Tak vyzkoušeno, potvrzeno:
Kód: [Vybrat]
import Data.STRef
import Control.Monad.ST

err _ = error "Ha!"

main = do
    print $ runST $ do
    ref <- newSTRef 0
    modifySTRef ref err
    writeSTRef ref 1
    readSTRef ref
- při použití modifySTRef vypíše "1", při použití modifySTRef' vypíše "Ha!".


Re:Má Haskell budoucnost?
« Odpověď #365 kdy: 17. 05. 2016, 23:14:55 »

POZOR REKLAMA POZOR REKLAMA POZOR REKLAMA :)


Kdybyste někdo měli zájem, tento čtvrtek 19.5. se v Brně koná první sraz zájemců o Elm:

http://www.meetup.com/Brno-Elm-Meetup/events/230668222/

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Má Haskell budoucnost?
« Odpověď #366 kdy: 18. 05. 2016, 01:05:13 »
Tak ten vtip zní "A monad is just a monoid in the category of endofunctors". Tak prozatím to chápu tak, že "monoid" znamená v podstatě "list" nebo "stream" a "kategorie endofunktorů" znamená, že jsem z té akce v listu schopen vytáhnout hodnotu a nějak ji předat následujícím akcím..
Tak to chápeš blbě :) Monoid znamená, že pro tu věc platí pravidla monoidu (asociativita a existence neutrálního prvku) a endofunktor je funktor, který mapuje kategorii na sebe samu.

Endofunktor je to proto, že libovolný haskellovský typ mapuje opět na haskellovský typ. A monoid je to proto, že bind je asociativní a return je neutrální prvek.

...ale neřekl bych, že by komukoli "normálnímu" tahle definice pomohla pochopit, o co jde :)
On to hlavně není vtip, takto to formuloval Mac Lane (vytrženo z kontextu to zní ovšem trochu abstrakně).

Pochopit tu definici je užitečné k hlubšímu vhledu do problematiky, ale nehodí se k prvotnímu vysvětlení.

andy

Re:Má Haskell budoucnost?
« Odpověď #367 kdy: 18. 05. 2016, 08:27:36 »
Tak ten vtip zní "A monad is just a monoid in the category of endofunctors". Tak prozatím to chápu tak, že "monoid" znamená v podstatě "list" nebo "stream" a "kategorie endofunktorů" znamená, že jsem z té akce v listu schopen vytáhnout hodnotu a nějak ji předat následujícím akcím..
Tak to chápeš blbě :) Monoid znamená, že pro tu věc platí pravidla monoidu (asociativita a existence neutrálního prvku) a endofunktor je funktor, který mapuje kategorii na sebe samu.

Endofunktor je to proto, že libovolný haskellovský typ mapuje opět na haskellovský typ. A monoid je to proto, že bind je asociativní a return je neutrální prvek.

...ale neřekl bych, že by komukoli "normálnímu" tahle definice pomohla pochopit, o co jde :)
On to hlavně není vtip, takto to formuloval Mac Lane (vytrženo z kontextu to zní ovšem trochu abstrakně).

Pochopit tu definici je užitečné k hlubšímu vhledu do problematiky, ale nehodí se k prvotnímu vysvětlení.

... a nebyl by ochoten mi to někdo teda vysvětlit? Když už jsme u toho, tak by mě to docela zajímalo. Monoid je asociativní - monoid je operace >>=. Operace >>= je řetězení operací za sebe. V monadu to znamená řetězení instrukcí za sebe (<> taky může počítat maximum). Takže se na to taky dá dívat jako na List, který interpret pomocí fold (>>=) interpretuje. Nebo nedá?

A endofunktor v té definici teda znamená co?

JSH

Re:Má Haskell budoucnost?
« Odpověď #368 kdy: 18. 05. 2016, 08:58:54 »
A endofunktor v té definici teda znamená co?
Ten endofunktor je "funkce" z typu na typ. Ta dostane na vstup nějaký typ T a vrátí nový typ "seznam T" nebo "akce vracející T" a podobně. Nehodí se to k prvotnímu vysvětlení, protože málokdo uvažuje stylem že typ "pole intů" získá tak že vezme typ "int" a prožene ho nějakou "funkcí" na úrovni typového systému.

JSH

Re:Má Haskell budoucnost?
« Odpověď #369 kdy: 18. 05. 2016, 09:05:26 »
Ještě bych měl asi dodat, že tohle se daleko líp chápe na něčem jednodušším než je Monád. Koukni se na Funktor. Tam je ta představa, že nějakou "funkcí" udělám z nějakého typu jejich seznam a z jednoduchých funkcí funkce pro seznamy, trochu jasnější.

Re:Má Haskell budoucnost?
« Odpověď #370 kdy: 18. 05. 2016, 10:14:20 »
... a nebyl by ochoten mi to někdo teda vysvětlit? Když už jsme u toho, tak by mě to docela zajímalo. Monoid je asociativní - monoid je operace >>=. Operace >>= je řetězení operací za sebe. V monadu to znamená řetězení instrukcí za sebe (<> taky může počítat maximum). Takže se na to taky dá dívat jako na List, který interpret pomocí fold (>>=) interpretuje. Nebo nedá?

A endofunktor v té definici teda znamená co?
Docela dobrý vysvětlení máš tady: http://stackoverflow.com/questions/3870088/a-monad-is-just-a-monoid-in-the-category-of-endofunctors-whats-the-issue ale podle mě nemá smysl si s tím lámat hlavu. Pokud tě aspoň úvod do teorie kategorií zajímá, tak bych vřele doporučil http://www1.eafit.edu.co/asr/pubs/others/cain-screen.pdf - je to nejsrozumitelnější popis pro programátora, jakej jsem zatím viděl. Už kolem strany 30 by ti to mělo začít být jasný a v kapitole 6.2.1 je to pak úplně explcitně.
« Poslední změna: 18. 05. 2016, 10:16:14 od Mirek Prýmek »

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Má Haskell budoucnost?
« Odpověď #371 kdy: 18. 05. 2016, 13:07:56 »
Tak ten vtip zní "A monad is just a monoid in the category of endofunctors". Tak prozatím to chápu tak, že "monoid" znamená v podstatě "list" nebo "stream" a "kategorie endofunktorů" znamená, že jsem z té akce v listu schopen vytáhnout hodnotu a nějak ji předat následujícím akcím..
Tak to chápeš blbě :) Monoid znamená, že pro tu věc platí pravidla monoidu (asociativita a existence neutrálního prvku) a endofunktor je funktor, který mapuje kategorii na sebe samu.

Endofunktor je to proto, že libovolný haskellovský typ mapuje opět na haskellovský typ. A monoid je to proto, že bind je asociativní a return je neutrální prvek.

...ale neřekl bych, že by komukoli "normálnímu" tahle definice pomohla pochopit, o co jde :)
On to hlavně není vtip, takto to formuloval Mac Lane (vytrženo z kontextu to zní ovšem trochu abstrakně).

Pochopit tu definici je užitečné k hlubšímu vhledu do problematiky, ale nehodí se k prvotnímu vysvětlení.

... a nebyl by ochoten mi to někdo teda vysvětlit? Když už jsme u toho, tak by mě to docela zajímalo. Monoid je asociativní - monoid je operace >>=. Operace >>= je řetězení operací za sebe. V monadu to znamená řetězení instrukcí za sebe (<> taky může počítat maximum). Takže se na to taky dá dívat jako na List, který interpret pomocí fold (>>=) interpretuje. Nebo nedá?

A endofunktor v té definici teda znamená co?
Předpokládám znalost definice monoidu a základních pojmů z teorie kategorií. Místo nosné množiny se vezme nějaký endofunktor nad nějakou kategorií, řekněme T. Místo operace nad monoidem (něříkám násobení, taky může být aditivní, prostě nějaká funkce o dvou parametrech tak, aby to byl monoid) se vezme přirozená transformace μ (jako multiplication) T∘T do T a místo unit elementu se vezme přirozená transformace η (jako identity) 1 do T (1 je id endofunktor). Nejdou tu kreslit komutativní diagramy, takže v symbolech: μ∘Tμ=μ∘μT a μ∘Tη=μ∘ηT=1 (první rovnost si vynucuje asociativitu a druhá identitu zleva a zprava). Žádná magie v tom není.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Má Haskell budoucnost?
« Odpověď #372 kdy: 18. 05. 2016, 14:40:11 »

POZOR REKLAMA POZOR REKLAMA POZOR REKLAMA :)


Kdybyste někdo měli zájem, tento čtvrtek 19.5. se v Brně koná první sraz zájemců o Elm:

http://www.meetup.com/Brno-Elm-Meetup/events/230668222/
Bude k tomu nějaký materiál?

Re:Má Haskell budoucnost?
« Odpověď #373 kdy: 18. 05. 2016, 14:56:45 »
Bude k tomu nějaký materiál?
Myslíš třeba jako kilo koksu? :)

Je to první setkání, asi spíš jenom pokec.

Re:Má Haskell budoucnost?
« Odpověď #374 kdy: 18. 05. 2016, 15:00:39 »
Bude k tomu nějaký materiál?
Myslíš třeba jako kilo koksu? :)
...

 ;D  ;D  ;D

Tak to zřejmě bude parádní a výživnej pokec!