2010-06-13 14 views
10

में Data.Map और Data.IntMap वर्तमान में हो सकता है कि में लिपटे मान साथ प्रकार हस्ताक्षरएक इकाई लौटने हास्केल नक्शे

lookup :: Ord k => k -> Map k a -> Maybe a 

यह

lookup :: (Monad m, Ord k) => k -> Map k a -> m a 
के और अधिक सामान्य प्रकार किया करते थे देखने समारोह

मुझे एहसास है कि पूर्व में अतिरिक्त प्रकार के विनिर्देश की आवश्यकता कम हो जाती है, लेकिन बाद वाला इसे अधिक सामान्य बना देगा और सूची समझ में लुकअप का उपयोग करने की अनुमति देगा। क्या इस व्यवहार की नकल करने के लिए नए संस्करण के साथ कोई तरीका है, या मुझे पुस्तकालय के पुराने संस्करण का उपयोग करना होगा?

उत्तर

5

डॉन की lift उनके सामान्य Monad समकक्षों की Maybe के तत्वों बदल देता है, तो शायद यह convert या generalize या कुछ ;-)

नाम दिया जाना चाहिए तुम सिर्फ सूची comprehensions और अन्य monads में मुख्य रूप से lookup उपयोग करना चाहते हैं कि एक fail लागू, आप भी fail के पैटर्न मैच विफलता की मैपिंग का उपयोग कर सकता: विशिष्ट cas लिए

 
Prelude> [ v | Just v <- return $ lookup "hi" [("ho","silver")] ] 
[] 
Prelude> [ v | Just v <- return $ lookup "ho" [("ho","silver")] ] 
["silver"] 

Prelude> do Just v <- return $ lookup "hi" [("ho","silver")] ; print v 
*** Exception: user error (Pattern match failure in do expression at <interactive>:1:3-8) 
Prelude> do Just v <- return $ lookup "ho" [("ho","silver")] ; print v 
"silver" 
+1

यह पूरी तरह से दिखाता है कि असफलता का उपयोग क्यों बुरा है: यह लगभग हमेशा एक प्रोग्राम अपवाद समाप्त होता है। नक्शे में देखने पर आप जो चाहते हैं वह नहीं। –

+0

ठीक है, मैंने कहा "मोनैड जो असफल लागू करते हैं", है ना? -) 'त्रुटि' अपरिभाषित नहीं है। मैं बस उस मामले को भी स्पष्ट करना चाहता था। व्यक्तिगत रूप से, मैं पैटर्न मिलान का उपयोग करता हूं जब डोनाड भी 'मोनाडप्लस' होता है और 'mzero' के रूप में 'विफल' लागू करता है। वह तब होता है जब यह तकनीक सबसे उपयोगी होती है। – claus

19

बाद यह बहुत अधिक सामान्य बनाना और अनुमति देने के देखने सूची comprehensions

बाद में इस्तेमाल किया जाएगा भी अधिक असुरक्षित है, जैसा कि इकाई वर्गों के बहुमत को परिभाषित error के रूप में असफल। यही है, मानचित्र में कोई तत्व नहीं ढूंढने का सामान्य मामला अधिकांश मोनैड के लिए प्रोग्राम-टर्मिनिंग त्रुटि है। कि, अनुमानित गलत प्रकार के संदर्भ की बढ़ती संभावना के साथ, इसका मतलब है कि हम अब 'monadic विफल वापसी' शैली को हतोत्साहित करते हैं।

वहाँ किसी भी तरह से नए संस्करण

दरअसल वहाँ के साथ इस व्यवहार की नकल करने के लिए है! बस शायद मोनाड में एक उठाएं, जैसे:

lift :: Monad m => Maybe a -> m a 
lift Nothing = fail "you die now" 
lift (Just a) = return a 

और अब आप लिख सकते हैं, उदा। lift . lookup

+0

त्वरित उत्तर डॉन के लिए धन्यवाद। मैं जो आया उसके मुकाबले यह काफी संक्षिप्त है। – sabauma

+0

'आधार' के अगले प्रमुख संस्करण के बाद यह जवाब अपडेट करने पर विचार करना समझदारी हो सकती है। ऐसा लगता है कि 'असफल' अंत में 'मोनाड' छोड़ रहा है, शायद एक नए 'मोनाडफेल' में लैंडिंग। – dfeuer

4

सूची मोनैड का ई, सबसे आसान समाधान maybeToList का उपयोग करना है:

Prelude> :m +Data.Maybe -- Note: Use "import Data.Maybe" in a program file 

Data.Maybe> [ v | v <- maybeToList $ lookup "hi" [("ho","silver")] ] 
[] 
Data.Maybe> [ v | v <- maybeToList $ lookup "ho" [("ho","silver")] ] 
["silver"] 
संबंधित मुद्दे