Я пытаюсь разобраться в обработке ошибок в Haskell. Я нашел статью « 8 способов сообщить об ошибках в Haskell », но не понимаю, почему Maybe и Either ведут себя по-разному.
Например:
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
дает результат «Ошибка»
, но вызов testMyDiv1 1 0
дает:
"*** Exception: My divison by zero
(Обратите внимание на отсутствие заключительной кавычки, указывающей, что это не строка но исключение).
Что дает?