एडवर्ड Kmett के अपवाद लाइब्रेरी ExceptT के लिए MonadMask उदाहरण प्रदान नहीं करता है।ExceptT के लिए कोई MonadMask उदाहरण क्यों नहीं है?
Ben Gamari once asked about this और फिर निष्कर्ष निकाला कि यह दस्तावेज़ीकरण द्वारा समझाया गया था।
नोट इस पैकेज
CatchT
के लिए एकMonadMask
उदाहरण प्रदान करता है कि: यह निकटतम प्रासंगिक दिखने मार्ग मैं मिल सकती है। यह उदाहरण केवल मान्य है यदि आधार मोनड एकाधिक निकास प्रदान करने की कोई क्षमता प्रदान नहीं करता है। उदाहरण के लिए,IO
याEither
अमान्य आधार मोनैड होंगे, लेकिनReader
याState
स्वीकार्य होगा।
लेकिन इसका अर्थ मेरे लिए स्पष्ट नहीं है। "एकाधिक निकास" का क्या अर्थ है और यह MonadMask
उदाहरण क्यों प्रतिबंधित करता है?
[...] 'MonadMask' है, जो आपको लगता है कि कुछ कार्रवाई चलाए जा रहे हैं गारंटी करने के लिए अनुमति देता है, यहां तक कि अपवाद (सिंक्रोनस और एसिंक्रोनस दोनों) की उपस्थिति में। उस गारंटी को प्रदान करने के लिए, मोनैड स्टैक निष्पादन के प्रवाह को नियंत्रित करने में सक्षम होना चाहिए। विशेष रूप से, इसमें उदाहरणों को शामिल नहीं किया गया है [...] एकाधिक निकास बिंदुओं के साथ मोनाड, जैसे
ErrorT
IO
से अधिक।
शायद यह इस विकल्प सवाल पूछने के लिए और अधिक स्पष्ट हो जाएगा: हम अलग ट्रांसफार्मर सेट करते हैं और थोड़ा सरल प्रकार पर विचार करें:
data IOEither a = IOEither { unIOEither :: IO (Either String a) }
deriving Functor
यह लगता है कि हम वास्तव में एक MonadMask
उदाहरण लिख सकते हैं :
instance Applicative IOEither where
pure = IOEither . return . Right
IOEither fIO <*> IOEither xIO = IOEither $
fIO >>= either (return . Left) (\f -> (fmap . fmap) f xIO)
instance Monad IOEither where
IOEither xIO >>= f = IOEither $
xIO >>= either (return . Left) (\x -> unIOEither (f x))
instance MonadThrow IOEither where
throwM e = IOEither (throwM @IO e)
instance MonadCatch IOEither where
catch (IOEither aIO) f = IOEither $ catch @IO aIO (unIOEither . f)
instance MonadMask IOEither where
mask f = IOEither $ mask @IO $ \restore ->
unIOEither $ f (IOEither . restore . unIOEither)
uninterruptibleMask f = IOEither $ uninterruptibleMask @IO $ \restore ->
unIOEither $ f (IOEither . restore . unIOEither)
क्या यह उदाहरण मैंने लिखा है ठीक से काम नहीं करता है?
इस सवाल में रुचि भी Snoyman के [* अपवाद हास्केल * में उत्तम आचरण] (https://www.fpcomplete.com/blog/2016/11/exceptions-best-practices-haskell) के लिए विचार करना चाहिए पाठकों 'आईओ (या तो स्ट्रिंग ए)' पर एक राय है कि बस एक प्रकार का उपयोग नहीं किया जाना चाहिए। –