2010-10-30 13 views
7

Mi pregunta es simple. Por qué la coincidencia de patrones incorrecta no arroja una excepción en Maybe monad. Para mayor claridad:Por qué la coincidencia de patrones no arroja una excepción en Maybe monad

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 

Mira tryConstuctHTTPTask función. Creo que cuando el patrón no coincide (por ejemplo, "Object getP") debemos obtener algo como "Prelude.Exception", en su lugar obtengo el "Nothing". Me gusta este comportamiento, pero no entiendo por qué.

Gracias.

Respuesta

11

Realizando pattern <- expression en un do -block, llamará a fail cuando el patrón no coincida. Por lo que es equivalente a hacer

expression >>= \x -> 
case x of 
    pattern -> ... 
    _ -> fail 

Desde fail se define como Nothing en el Maybe mónada, se obtiene Nothing para el patrón fallado partidos usando <-.

+0

donde miro el código fuente original de esta Monad. – Anton

+0

@ Antón: Puede encontrarlo en la fuente del módulo ['Data.Maybe'] (http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/src/ Data-Maybe.html), pero la definición es simplemente 'fail _ = Nothing'. – sepp2k

+0

no encontré el proceso de coincidencia de patrones. Solo (Solo x) >> = k = k x – Anton

Cuestiones relacionadas