Ten problém je, že bottom je de-fakto "undefined behaviour". Například kdyby Haskell na "error" zareagoval nekonečnou smyčkou, tak je to vcelku korektní chování překladače.
Tak moment, tohle budu chtít vysvětlit. Kde je ve standardu Haskellu napsáno, že je něco z mého programu undefined behavior? Kde je ve standardu napsáno, že error může překladač přeložit jako nekonečnou smyčku?
To je z computer science - všechny typy v haskellu obsahují bottom, no a error je funkce, která díký free theoremům má výstupní typ pouze bottom:
A function whose return type is bottom cannot return any value.
Takže ta funkce se prostě nemůže nikdy vrátit. Taky v pure kódu není bottom observable.
Takže v tom kódu výše v podstatě spoléháš na implementační detail v haskellu, že programátoři asi v takovémhle případě nechtějí aby jim to věčně cyklilo, ale chtěli by tuhle rozbitost zachytit a případně udělat nějakou error recovery, takže Haskell v některých případech nezacyklí, ale vyhodí výjimku. Sémanticky je to na té úrovni chytat SIGSEGV.
Proto se taky v Haskellu "error" dneska používá prakticky výhradně ve větvích kódu, které by se stejně nikdy neměly provést a pokud se provedou, jedná se o chybu programu.
Pointa je, že optimalizační flag v C (a C++ to bude úplně stejně) rozbije program.
Rozbije ho, protože dojde paměť. Kdyby paměť nedošla, bude ten program s optimalizací nebo bez dávat stejný výstup. V Haskellu to s/bez XStrict stejný výstup dát nemusí. To je zásadní rozdíl.
Ne, jsme na tom úplně stejně jako v haskellu - tohleto vyhodnocování je všechno otázka pure kódu a ten to vyhodnotí buď stejně, nebo to dá bottom. No a odchycení bottom je zhruba na stejné úrovni, jako když si uděláš signal handler na SIGSEGV, tu výjimku stack overflow odchytíš a něco napíšeš na výstup. No a pokud tu rekurzi budeš dělat dostatečně dlouho, tak se dá vcelku garantovat, že ta paměť dojde. Takže ta změna optimalizace má vliv na výstup...
Používej hlavu. Program nespadne a dává s lazy/strict jiný výstup. To je zásadní problém, pokud očekáváš jedno řešení, minimálně jedna varianta je prostě rozbitá. A pokud chceš tvrdit, že ta strict, tak ti klidně prohodím ty texty, které to píše.
Je rozbitá ta Strict, protože tam dojde k bottom. Když prohodíš ty texty, tak to na tom nic nezmění.