2010-10-30 10 views
7

Meine Frage ist einfach. Warum falsche Mustererkennung keine Ausnahme in Maybe Monad wirft. Aus Gründen der Klarheit:Warum Mustererkennung keine Ausnahme auslöst. Vielleicht 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 

Blick auf tryConstuctHTTPTask Funktion. Ich denke, dass, wenn das Muster nicht übereinstimmt (zum Beispiel "Object getP") müssen wir etwas wie "Prelude.Exception", stattdessen bekomme ich die "Nothing". Ich mag dieses Verhalten, aber ich verstehe nicht warum.

Danke.

Antwort

11

Doing pattern <- expression in einem do-Block, wird fail aufrufen, wenn das Muster nicht übereinstimmt. So ist es äquivalent zu tun

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

Seit fail als Nothing im Maybe Monade definiert ist, erhalten Sie Nothing für ausgefallene Muster <- Spiele verwenden.

+0

wo schaue ich auf ursprünglichen Quellcode dieser Monade. – Anton

+0

@Anton: Sie finden es in der Quelle für das ['Data.Maybe'-Modul] (http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/src/ Data-Maybe.html), aber die Definition ist einfach "fail _ = Nothing". – sepp2k

+0

Ich habe dort keinen Musterabgleichprozess gefunden. Nur (Just x) >> = k = k x – Anton

Verwandte Themen