2011-02-11 15 views
7

मेरे पास एक एल्गोरिदम है जो एक इंटैम्प पर काम करता है जो मुझे लगता है कि सबसे अच्छा रूप से व्यक्त किया जाएगा। नक्शे में मूल्य एक्स के लिएक्या डेटा.मैप/डेटा.इन्टैप के लिए एक मोनाड उदाहरण मौजूद है?

  • देखो: यह मैं जैसी चीजों कहना चाहते हैं, है।
  • यदि यह मानदंड से मेल खाता है, तो इस मान को मानचित्र से हटा दें।
  • लूप जब तक मानचित्र में कोई और मूल्य मौजूद न हो।

यह काफी एक दो लाइन प्रत्यावर्तन के रूप में व्यक्त करने के लिए तुच्छ हो सकता है, लेकिन वास्तविक एल्गोरिथ्म एक छोटे से अधिक जटिल है, कई लुकअप और विलोपन से जुड़े हैं, इसलिए मैं do अंकन में यह व्यक्त करने में सक्षम होना चाहते हैं ।

do 
    insert 5 20 
    (ma, mv) <- lookup 4 
    case mv of 
    Just v -> delete (fromJust ma) 
    Nothing -> return() 

ईमानदारी से मुझे यकीन है कि कैसे सबसे अच्छा यह व्यक्त करने के लिए नहीं कर रहा हूँ:

एक मानक इकाई की तरह "राज्य" जहां राज्य Data.Map या Data.IntMap, जहां मैं की तरह कुछ कर सकते हैं का प्रतिनिधित्व करती है है। lookup के कारण यह किसी प्रकार के MaybeT IntMap m स्टैक या कुछ से लाभान्वित प्रतीत होता है।

मैं काम पर Data.IntMap आधारित अपने ही राज्य इकाई को परिभाषित करने की कोशिश कर का एक सा कर किया था, यहां तक ​​कि जहाँ तक हो गया insert और delete काम करने के रूप में है, लेकिन कैसे lookup से निपटने के लिए साथ एक छोटी सी अटक गया। अधिकतर मुझे लगता है कि शायद ऐसा कुछ है जो किसी ने पहले ही हल कर लिया है, लेकिन मुझे इसे हैकेज पर नहीं मिल रहा है।

उत्तर

21

क्या कोई विशेष कारण है कि आप मोनड ट्रांसफार्मर का उपयोग करना टालना चाहते हैं? यदि आप Hackage से MaybeT पैकेज पाने आप प्राप्त कर सकते है कि इस प्रकार हैं:

import Control.Monad 
import Control.Monad.Maybe 
import Control.Monad.State 
import qualified Data.Map as Map 

type MapM k v a = MaybeT (State (Map.Map k v)) a 

lookupM k = MaybeT $ Map.lookup k `liftM` get 
insertM k = modify . Map.insert k 
deleteM k = modify $ Map.delete k 

runMap m = (flip execState) m . runMaybeT 

foo = runMap Map.empty $ do 
    insertM 5 20 
    v <- lookupM 4 
    deleteM v 

जब lookupM विफल रहता गणना के बाकी विफल रहता है। आप किसी भी समय इन मोनैड में प्रवेश और भाग सकते हैं ताकि आप इन्हें शुद्ध फ़ंक्शन इंटरफ़ेस के अंतर्गत छुपा सकें, यह केवल आईओ मोनैड है जिसे आप मुख्य (और असुरक्षित कार्यों का उपयोग करके) से बाहर निकलने का अनुमान नहीं लगाते हैं।

आपको याद रखने की ज़रूरत है कि कोई भी राज्य कार्रवाई जो लौटती है शायद हो सकता है कि हो सकता है कि हो सकता है कि हो सकता है कि हो सकता है कि हो सकता है। यदि आप आईओ को स्टेट स्टेट में बदलना चाहते हैं।

+0

वाह। धन्यवाद। मुझे ट्रांसफॉर्मर का उपयोग करने के लिए वास्तव में उपयोग करने की आवश्यकता है। यह उदाहरण व्यावहारिक रूप से उनका उपयोग करने के तरीके को दिखाने में एक बड़ी सहायता है। सभी मोनड ट्यूटोरियल आपको दिखाते हैं कि स्क्रैच से एक कैसे बनाया जाए, लेकिन शायद ही कभी वे आपको दिखाएंगे कि पहले से ही क्या उपलब्ध है इसका लाभ उठाना है। – Steve

+1

@Steve मुझे मोनाड ट्रांसफार्मर को समझने में क्या मदद मिली है, उन्हें केवल मोनैड के ढेर के रूप में या परतों के साथ प्याज और रिकॉर्ड फ़ील्ड या प्रत्येक स्तर पर प्रत्येक मोनैड ट्रांसफॉर्मर प्रकार पॉप/छिलके के कार्यों को चलाने के लिए नीचे के स्तर को प्रकट करने के लिए विचार करना है। –

संबंधित मुद्दे