Мой вопрос простой. Почему неправильное сопоставление с образцом не вызывает исключение в монаде 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 ". Мне нравится такое поведение, но я не понимаю, почему.
Спасибо.