2010-10-30 7 views
7

में अपवाद फेंक नहीं है मेरा प्रश्न सरल है। क्यों गलत पैटर्न मिलान शायद मोनड में अपवाद फेंक नहीं है। tryConstuctHTTPTask समारोह मेंक्यों हो सकता है पैटर्न मिलान शायद मोनड

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 

देखो: स्पष्टता के लिए। मुझे लगता है कि जब पैटर्न मेल नहीं खाता है (उदाहरण के लिए "ऑब्जेक्ट getP") हमें कुछ "प्रीलूड.एक्सप्शन" प्राप्त करना होगा, इसके बजाय मुझे "कुछ भी नहीं" मिलता है। मुझे यह व्यवहार पसंद है लेकिन मुझे समझ में नहीं आता क्यों।

धन्यवाद।

उत्तर

11

pattern <- expressiondo -block में, fail पर कॉल करें जब पैटर्न मेल नहीं खाता है। तो यह क्या कर रही

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

fail के बाद से Maybe इकाई में Nothing के रूप में परिभाषित किया गया है के बराबर है, तो आप मैच <- का उपयोग कर में विफल रहा है पैटर्न के लिए Nothing मिलता है।

+0

मैं इस मोनाड के मूल स्रोत कोड को कहां देख सकता हूं। – Anton

+0

@ एंटन: आप इसे ['Data.Maybe' मॉड्यूल] के स्रोत में पा सकते हैं (http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/src/ डेटा-होय.html), लेकिन परिभाषा बस 'असफल _ = कुछ भी नहीं' है। – sepp2k

+0

मुझे पैटर्न मिलान प्रक्रिया नहीं मिली। केवल (बस एक्स) >> = के = के x – Anton