Почему сопоставление с образцом не вызывает исключение в монаде Maybe

Мой вопрос простой. Почему неправильное сопоставление с образцом не вызывает исключение в монаде Maybe. Для ясности:

data Task = HTTPTask {
 getParams   ::  [B.ByteString],
 postParams  ::  [B.ByteString],
 rawPostData ::  B.ByteString 
}  deriving (Show)

tryConstuctHTTPTask :: B.ByteString -> Maybe Task
tryConstuctHTTPTask str = do
 case decode str of
    Left _  -> fail ""
    Right (Object trie) -> do
        Object getP    <- DT.lookup (pack "getParams")   trie
        Object postP   <- DT.lookup (pack "postParams")  trie
        String rawData <- DT.lookup (pack "rawPostData") trie
        return $ HTTPTask [] [] rawData

Посмотрите на функцию tryConstuctHTTPTask . Я думаю, что если шаблон не соответствует (например, « Object getP »), мы должны получить что-то вроде « Prelude.Exception », вместо этого я получаю « Nothing ". Мне нравится такое поведение, но я не понимаю, почему.

Спасибо.

8
задан Don Stewart 2 May 2011 в 21:04
поделиться