Mohlo by to být i jinak, třeba že bys generoval list IO operací a ty potom realtime provedl přesně v tom pořadí, v jakém v listu jsou. Ale to by bylo mimo jazyk. Ten jazyk sám o sobě by zůstal pořád líný.
Ale mě čím dál víc připadá, že to tak v podstatě je - že IO je jen způsob jak v "pure" jazyce popsat, jak se ty efekty mají dělat a nějaký "interpret" to následně provede. Ostatně dnes je docela časté si napsat vlastní interpret (Free/Operational monady) a psát si pak kód ve vlastním monadu.
Prostě pokud v líném jazyce chceš vynutit pořadí, uděláš to třeba pomocí monády a pokud chceš vynutit línost v nelíném jazyce, uděláš to třeba pomocí futures. Oboje jde a ani jedno neporušuje línost/nelínost toho jazyka. Je to jenom způsob, jak ho nějakou fintou donutit udělat něco, co by jinak "sám od sebe" negarantoval.
A není to nakonec Monad docela hezký způsob jak popsat, co má program dělat? Jak bys to popsal jinak? Monad je způsob, jak něco popíšeš, je to datová struktura, se kterou jsi schopen nějak pracovat a vyhodnocovat ji. V ostatních jazycích mi připadá, že funkce je de-fakto "black-box". Monad ten black-box vlastně umožní rozložit. Ale když se ti to nelíbí, tak vůbec nemusíš řešit, jak to funguje - (IO x) ber jako "pointer na funkci", a když to vložíš do těla IO funkce, tak se vykoná. A jsi zpátky v normálních jazycích, v čem je problém?
...no a to je právě ta pointa: mně přijde, že pořadí potřebujeme častěji, proto je lepší ho mít jako default a finty používat na línost, ne naopak.
Mě naopak připadá, že dát tam nějaký hack kvůli tomu, že chceš IO popsat nějak jinak, než všechno ostatní, co děláš, by nebylo úplně dobré....