Я пытаюсь разобраться с обработкой ошибок в Haskell. Я нашел статью " 8 способов сообщать об ошибках в Haskell", но я смущен, почему, возможно, и все ведут себя по-другому.
Например:
import Control.Monad.Error
myDiv :: (Monad m) => Float -> Float -> m Float
myDiv x 0 = fail "My divison by zero"
myDiv x y = return (x / y)
testMyDiv1 :: Float -> Float -> String
testMyDiv1 x y =
case myDiv x y of
Left e -> e
Right r -> show r
testMyDiv2 :: Float -> Float -> String
testMyDiv2 x y =
case myDiv x y of
Nothing -> "An error"
Just r -> show r
Вызов testMyDiv2 1 0
дает результат "An error"
, но вызов testMyDiv1 1 0
дает:
"*** Exception: My divison by zero
(Обратите внимание на отсутствие закрывающей цитаты, указав, что это не строка, а исключение).
Что дает?