में बदलना मैं उदाहरण लेने की कोशिश कर रहा हूं ExceptT a (StateT A M)
, कुछ ठोस प्रकार A
और monad M
के लिए, और उन्हें अपने नए कस्टम monads में लपेटें।मोनाड्स को टिडिंग करना - एक मोनैड ट्रांसफॉर्मर का नया टाइप मोनैड
सबसे पहले मैं पहचान है कि StateT A M
अन्य संदर्भों में अक्सर दिखाई देता है और इस तरह मैंने तय कर लिया है कि यह एक इकाई M1
में है कि अकेले रैप करने के लिए और फिर M2
में ExceptT a M1
लपेट सबसे अच्छा होगा।
वांछित संपत्ति MonadState
की M1
और M2
उदाहरणों और M
के वर्ग बनाने के लिए है (मान यह MyMonadClass
कहा जाता है की सुविधा देता है)। M2
MonadError
का एक उदाहरण होना चाहिए।
सबसे पहले मैं सरल प्रकार समानार्थी शब्दों द्वारा शुरू किया:
type MyState = StateT A M
type MyBranch a = ExceptT a MyState
तो मैंने सोचा था कि मैं पहले उदाहरण घोषणाओं (उदाहरण के लागू करने के बिना) और Thats जहाँ मैं पहली बार अटक गया स्केच होगा। instance MonadState A (MyState)
सही वाक्यविन्यास नहीं लग रहा था। मैंने सोचा कि मुझे newtype MyState' a = StateT a M
और फिर type MyState = MyState A
बनाना होगा (भाषा एक्सटेंशन का उपयोग न करें जहां आवश्यक नहीं है)।
हालांकि एक बार मैंने समानार्थी को newtype
घोषणाओं में परिवर्तित करना शुरू कर दिया, तो मैंने StateT A M
और ExceptT ...
प्रकारों से कनेक्शन खोना शुरू कर दिया।
newtype MyState' s a = MyState' { runMyState :: s -> (s, a) }
type MyState = MyState' A
newtype MyBranch e a = MyBranch { runMyBranch :: MyState (Either e a) }
अब ट्रांसफार्मर कि पहले से ही गायब हो गया कार्यान्वित कर रहे हैं और मुझे लगता है कि मैं कुछ खास मतलब नहीं है करने के लिए कोशिश कर रहा हूँ। तो मेरा सवाल यह है कि: इस तरह के व्यवहार को नए यौगिक मोनैड्स में सही ढंग से कैसे लपेटें जो नीचे परतों को सुलभ बनाते हैं ताकि कोई अनावश्यक उठाने से बचा जा सके और चीजों को स्पष्ट और व्यवस्थित रख सके।
आपको बहुत बहुत धन्यवाद, यह एक महान जवाब है। क्या मैं किसी भी तरह से भाषा विस्तार के बिना कर सकता हूं जैसे कि 'सामान्यीकृत न्यूटाइपडिविंग'? – jakubdaniel
@JakubDaniel निश्चित रूप से, आप हाथ से सभी उदाहरण लिख सकते हैं। लेकिन आप नहीं चाहते (और शायद गड़बड़ कर देंगे), इस प्रकार 'सामान्यीकृत न्यूटाइपडिविंग'। – Cirdec
जीएचसीआई में ': set -ddump-deriv'' आदेश चलाने वाले वास्तविक कोड को देखने के लिए, यह आपको सभी कोड जीएचसी उदारता से आपके लिए लिखता है। 'डेटा एबी = ए | बी ईक 'डंप' उदाहरण GHC.Classes.Eq Ghci5.AB जहां (GHC.Classes। ==) Ghci5.A Ghci5.A = GHC.Types.True; (जीएचसी.क्लास। ==) Ghci5.B Ghci5.B = जीएचसी.Types.True; (जीएचसी.क्लास। ==) _ _ = जीएचसी। टाइप्स। फाल्स ' –