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?
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.