Haskell: Почему типы Maybe и Either ведут себя по-разному при использовании в качестве монад?

Я пытаюсь разобраться в обработке ошибок в 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

(Обратите внимание на отсутствие заключительной кавычки, указывающей, что это не строка но исключение).

Что дает?

13
задан stusmith 25 September 2010 в 21:07
поделиться