2011-09-06 9 views
11

क्या मोनैड से "चीजें" लेने का कोई तरीका है?हास्केल में एक मोनड से मूल्य कैसे निकालें?

मैं एक गेम विकसित कर रहा हूं, और अब मैं डेटाबेस के बारे में समझने की कोशिश कर रहा हूं। मुझे happstack वास्तव में अच्छा लगा, लेकिन मुझे बात नहीं मिल रही है।

उदाहरण के लिए, मैं इस समारोह है (आशा है कि आप happstack से परिचित हैं)

getAllThings :: MonadIO m => m [Thing] 
getAllThings = do 
      elems <- query GetThings 
      return elems 

तो मैं m [Things] मिलता है, लेकिन मैं अपने मॉडल में इस का उपयोग नहीं कर सकता! उदाहरण के लिए

doSomeThingWithThings :: [Thing] -> Something 

मैंने इसे गुगल किया और मुझे कुछ भी नहीं मिला।

+2

आप काल्पनिक के बारे में मेरी टिप्पणी का आनंद सकता है [ 'magicMonadUnwrap'] (http://stackoverflow.com/questions/7154518/unwrapping-a-monad/7156230#7156230) (इसी तरह के स्टैक ओवरफ्लो प्रश्न का उत्तर) –

उत्तर

16

आप आईओ इस तरह से इकाई (unsafePerformIO समारोह को छोड़कर) से बाहर निकलने के अपेक्षा की जाती है नहीं, लेकिन आप अभी भी इसके अंदर अपने कार्य का उपयोग कर सकते हैं:

process :: MonadIO m => m() 
process = do 
      elems <- getAllThings 
      let smth = doSomeThingWithThings elems 
      -- ... 
+4

आप इस तरह से सोच सकते हैं: आपका पूरा कार्यक्रम आईओ मोनड है , और आपका मॉडल शुद्ध कार्यों का समूह है जो इसके अंदर निष्पादित किया जाता है। – bravit

+0

हां !! अपने उत्तरों के साथ अपने प्रश्न को फिर से सोचने के बाद, मैं समझता हूं कि यह इस तरह से होना चाहिए !, मेरा खेल है (जैसा कि आपने कहा) शुद्ध कार्य है, लेकिन उपयोगकर्ता इंटरफ़ेस असली बदसूरत दुनिया है, इसलिए दृढ़ता भाग भी होना चाहिए! – Illiax

2

elems <- query GetThings बाद elems है [Thing] तो <- अंदर करना करने के बारे में है मोनड से बाहर चीजें (बाध्य ऑपरेशन कहा जाता है)। आखिरी वक्तव्य return चीजों को एक मोनैड के अंदर रखता है। तो या तो आपको प्राप्त हो elems के बाद और return से पहले या जहां अन्य समारोह कॉल कर सकते हैं कभी आप getAllThings बुला रहे हैं आप इकाई से <- का उपयोग कर मान प्राप्त उपयोग करें और यह आपके कार्य करने के लिए पारित कर सकते हैं

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