Dokumentace Haskellu je prostě nekonzistetní. Program v Haskellu může chytit ErrorCall exception a odlišit tak volání error od bottom. Když koukám na Control.Exception, tak jsou tam další zajímavé věci. Takže si asi dáme další nekonečné kolečko teoretizování o bottom a invariantnosti strict -> lazy transformace v Haskellu:
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Exception
main = catch
(do
putStrLn "Tento program zjišťuje, zda lze zadaným číslem dělit. Zadejte číslo"
input <- getLine
let n = (read input :: Int)
let a = div 1 n
putStrLn "Tímto číslem lze dělit"
)
(\(err :: ArithException) -> putStrLn "Tímto číslem nelze dělit")
Strict:
ghc -O2 -XStrict test.hs
./test
Tento program zjišťuje, zda lze zadaným číslem dělit. Zadejte číslo
0
Tímto číslem nelze dělit
Lazy:
ghc -O2 test.hs
./test
Tento program zjišťuje, zda lze zadaným číslem dělit. Zadejte číslo
0
Tímto číslem lze dělit