आप 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))
एक मोनड नहीं है।
टाइम मशीन? क्या आप कुछ संदर्भ प्रदान कर सकते हैं? क्या यह कुछ "पन इरादा" मजाक है, या यह कुछ उन्नत गणितीय/प्रोग्रामिंग विज्ञान शब्द है? – Tarrasch
यहां कोई पेंच नहीं है, मैं एक वास्तविक समय मशीन के बारे में बात कर रहा हूं। एक बार आपके पास हो जाने के बाद, आप इस मोनैड को कार्यान्वित कर सकते हैं। – Rotsor
@ रोटर्स: समझाने की देखभाल * क्यों * ने कहा कि टाइम मशीन की आवश्यकता है? – ivanm