2011-09-16 10 views
5

मैं हास्केल के लिए नया हूं। मैंने अपना खुद का मोनड लिखा है जो त्रुटि प्रबंधन के साथ राज्य मोनड है:हास्केल में अपने स्वयं के मोनड में आईओ कैसे जोड़ें?

newtype MyMonad a = MyMonad (State -> Either MyError (State, a)) 

मैं इसे एक छोटी भाषा के दुभाषिया में उपयोग करता हूं। अब मैं अपनी भाषा (पढ़ना/लिखना) में कुछ आईओ ऑपरेशंस जोड़ना चाहता हूं, लेकिन मुझे नहीं पता कि मेरे अंदर आईओ मोनैड को कैसे बंद किया जाए। मुझे पता है कि मैं एररटी, स्टेटटी, आईओ को जोड़ सकता हूं और इस परिणाम को प्राप्त कर सकता हूं लेकिन क्या उनके बिना ऐसा करने का कोई और तरीका है?

उत्तर

6

आप StateT कैसे कार्यान्वित किया जाता है देख सकते हैं:

newtype StateT s m a = StateT { runStateT :: s -> m (a,s) } 

IO साथ राज्य संयोजित करने के लिए आप सिर्फ m के स्थान पर IO रख दिया और इच्छित प्रकार मिलता है: s -> IO (a,s)

यदि आपके पास त्रुटियां भी हैं, तो यह s -> IO (Either e (a, s)) या s -> IO (Either e a, s) जैसा कुछ हो जाता है, इस पर निर्भर करता है कि आप विफल कंप्यूटेशंस को प्रभावित करने के लिए चाहते हैं या नहीं।

ध्यान दें कि आप एक समय मशीन के बिना s -> Either e (IO (a, s)) एक monad नहीं बना सकते हैं।

अद्यतन

यह पता चला आप यह भी टाइम मशीन के साथ एक इकाई नहीं कर सकता।

दिखाने के लिए कारण है कि यह असंभव है, हमें का उपयोग कर () बजाय s पहले के द्वारा हमारे इकाई को आसान बनाने में करते हैं: data M e a = M { runM :: Either e (IO a) }

अब, निम्नलिखित कार्यक्रम की कल्पना:

unsafePerformIO :: IO a -> a 
unsafePerformIO io = fromLeft $ runM $ do 
    a <- M $ Right $ io 
    M $ Left a 

जाहिर है, इस समारोह असंभव है और इस प्रकार M के लिए मोनाड उदाहरण भी असंभव है।

आपको किस समय मशीन IO का इलाज करने की क्षमता दे सकती है जैसे कि State का इलाज करता है। हालांकि, मुझे एहसास नहीं हुआ कि Either e (s -> (a, s)) एक मोनड नहीं है।

+0

टाइम मशीन? क्या आप कुछ संदर्भ प्रदान कर सकते हैं? क्या यह कुछ "पन इरादा" मजाक है, या यह कुछ उन्नत गणितीय/प्रोग्रामिंग विज्ञान शब्द है? – Tarrasch

+1

यहां कोई पेंच नहीं है, मैं एक वास्तविक समय मशीन के बारे में बात कर रहा हूं। एक बार आपके पास हो जाने के बाद, आप इस मोनैड को कार्यान्वित कर सकते हैं। – Rotsor

+1

@ रोटर्स: समझाने की देखभाल * क्यों * ने कहा कि टाइम मशीन की आवश्यकता है? – ivanm

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