A jinak teď konkrétně, proč je to blbě: Typový systém je (mimo jiné) od toho, aby dokázal zabránit některým nežádoucím stavům programu. Vzhledem k tomu, že to je obecně nerozhodnutelný problém, tak ve výsledku některé korektní programy nepropustí, nebo naopak některé nekorektní programy projdou. Třeba v Liquid haskellu bys možná u toho sqrt mohl vynutit, aby to bylo pouze pro pozitivní čísla (nejsem si úplně jistý, jestli umí s floatama, ale pro celá čísla by to měl umět). Jaký je teda rozdíl mezi "sqrt(-3)", který kompiler odmítne, protože už předem zjistí, že to není definovaná hodnota - a "sqrt(-3)", které spadne až za běhu, protože to kompilerem prošlo? Jak je možné, že to první je "nekorektní program", to druhé "korektní program", přitom se to akorát liší schopnostma překladače?
Jazyky, které mají totality checking by přesně tenhle program vyhodily jako nekorektní. Protože jsou schopny v typovém systému postihnout "non-termination". Haskell to neumí, takže ten program projde typovým systémem a selže až při běhu. Úplně stejně, jako ti projde typová chyba, když tomu dáš "-fdefer-type-check". Non-termination je bug. Undefined behaviour to není, protože haskellové programy nemají "behaviour". Behaviour má akorát tak ten "IO engine", který ty IO akce spouští.