Znáš tohle?
x = y.
Then x2 = xy.
Subtract the same thing from both sides:
x2 - y2 = xy - y2.
Dividing by (x-y), obtain
x + y = y.
Since x = y, we see that
2 y = y.
Thus 2 = 1, since we started with y nonzero.
Subtracting 1 from both sides,
1 = 0
Tak to je tvůj kód. Když se v kódu vyskytne undefined (tady dělení nulou), tak výsledek může být cokoliv. No a Haskell má volnost v tom, co si s tím kódem může dělat, pokud jsou ty operace ekvivalentní. Přechod Strict -> Lazy jsou všechno operace, které nemění výsledek. Takže všechny ty výsledky, které jsi psal - jsou správné. Odpovídají zadání, které jsi vyjádřil tím zdrojovým kódem. Že to umožňuje víc správných výsledků? Jo, přesně tak jsi to zadal. Rozbije to Strict -> Lazy? Ne, jenom ti vrátí druhý možný výsledek.