Nevím, co myslíš tím "monadická záležitost". Haskell prostě může cokoli vyhodnotit kdykoli, takže kdybych dal za sebe
print "a"
print "b"
tak mi to může vypsat "a\nb\n" i "b\na\n".
Nemůže. Protože to za sebe dáš akorát tak v IO monadu, jinde ne. Musíš trošičku pochopit IO monad (spíš rozdíl mezi pure a non-pure, kdy použít let a kdy <-). Lazy jsou pure výpočty, efekty jsou vždy explicitně řazeny. Takže IMO to prostě nemá vůbec žádný smysl řešit.
Tomu říkáš "co je na tom za komplikaci"?
Tak když vezmu třeba příklad, co tady byl dán:
foldl (+) 0 [1..1000000]
foldl' (+) 0 [1..1000000]
Takže faktem je, že v obou případech je potřeba, aby to pole byl vlastně Stream. Protože Haskell umí použít Fusion a to pole nealokovat. Takže v případě Strict jazyka nastává otázka, jestli tyhle věci mají být všechny Stream, nebo naopak všechny pole.
A k foldl tu máme ještě foldr - problém je, že foldl má smysl jenom strict a foldr zase typicky lazy. A to nemá nic společného s jazykem, ale spíš s tím, jak ty funkce pojmenovat. Z hlediska konzistence to takhle dává hodně smysl, z hlediska začátečníka to je trochu problém.... (možná by to chtělo udělat foldl depracated, aby aspoň varoval).
Takže ve výsledku je v haskellu všechno lazy s tím, že těch pár příkladů, kde to dává smysl, to můžeš snadno anotovat jako strict (např. maybe prostě striktně smysl nedává) vs. strict jazyky, kde vlastně na první pohled netušíš, jestli je funkce strict nebo lazy, nebo to máš poseté variantami funkcí a la Maybe v purescriptu.
No ale co by to mělo dokazovat? Haskell je složitý, protože je lazy a ty lazy obraty by fungovaly i kdyby lazy nebyly?! No to dá rozum, na tom není nic zajímavého. Zajímavé je to, že ty obraty jsou složité, ABY mohly být lazy. Pokud jazyk lazy není, složité obraty nepotřebuje. To je odpověď na tu otázku "čemu vadí, že je lazy".
No mě teda Maybe v haskellu připadne zcela triviální. Maybe v purescriptu má 2x tolik funkcí, aby obsloužilo totéž.
Hlavně ale myslel jsem to opačně: strict kód funguje jako lazy bez problémů (minus sem tam problém se stack overflow a space leaky), lazy kód ve strict prostředí fungovat vůbec nemusí (a performance taky může být problém, jen jinde). Takže člověk, který s tím jazykem začíná, prostě to, že to je lazy vůbec řešit nemusí. Může psát strict kód a chová se to přesně tak, jak by čekal. S foldl stack overflow jsem se nepotkal, s lazy modifyIORef ano a člověk se aspoň něco naučí
Ale fakt se tohle přehání...