अनुक्रमित मोनाड क्या है?


98

अनुक्रमित मठ और इस मठ के लिए प्रेरणा क्या है ?

मैंने पढ़ा है कि यह दुष्प्रभावों का ट्रैक रखने में मदद करता है। लेकिन हस्ताक्षर और प्रलेखन मुझे कहीं भी नहीं ले जाते हैं।

इसका एक उदाहरण क्या होगा कि यह साइड इफेक्ट्स (या किसी अन्य वैध उदाहरण) पर नज़र रखने में कैसे मदद कर सकता है?

जवाबों:


123

हमेशा की तरह, शब्दावली लोगों का उपयोग पूरी तरह से संगत नहीं है। कई तरह के प्रेरित-से-मोनड्स हैं, लेकिन कड़ाई से बोलने वाले-काफी-विचार नहीं हैं। शब्द "अनुक्रमित मोनाड" एक संख्या में से एक है (जिसमें "मोनडिश" और "पैरामीटराइज़्ड मोनड" (उनके लिए एटिक्स का नाम)) एक ऐसी धारणा की विशेषता है। (एक अन्य ऐसी धारणा, यदि आप रुचि रखते हैं, तो कतसुमता का "पैरामीट्रिक प्रभाव मोनाड" है, जो एक मोनॉइड द्वारा अनुक्रमित होता है, जहां रिटर्न न्यूट्रल रूप से अनुक्रमित होता है और इसके सूचकांक में बाँध होता है।)

सबसे पहले, चलो प्रकार की जांच करते हैं।

IxMonad (m :: state -> state -> * -> *)

यही है, "गणना" (या "कार्रवाई" का प्रकार, यदि आप चाहें, लेकिन मैं "गणना" के साथ चिपका रहूँगा), जैसा दिखता है

m before after value

जहां before, after :: stateऔर value :: *। यह विचार एक बाहरी प्रणाली के साथ सुरक्षित रूप से बातचीत करने के साधनों को पकड़ने के लिए है जिसमें राज्य की कुछ पूर्वानुमानित धारणा है। एक संगणना का प्रकार आपको बताता है कि राज्य को क्या होना चाहिए before, राज्य क्या होगा afterऔर यह *किस प्रकार चलता है (जैसे नियमित साधुओं के साथ ) valueसंगणना किस प्रकार का उत्पादन करती है।

सामान्य बिट्स और टुकड़े *एक stateमोनाड की तरह- और डोमिनोज़ खेलने की तरह -वाइज़ होते हैं।

ireturn  ::  a -> m i i a    -- returning a pure value preserves state
ibind    ::  m i j a ->      -- we can go from i to j and get an a, thence
             (a -> m j k b)  -- we can go from j to k and get a b, therefore
             -> m i k b      -- we can indeed go from i to k and get a b

इस तरह से उत्पन्न "क्लेइसली तीर" (फ़ंक्शन जो गणना की उपज देता है) की धारणा है

a -> m i j b   -- values a in, b out; state transition i to j

और हमें एक रचना मिलती है

icomp :: IxMonad m => (b -> m j k c) -> (a -> m i j b) -> a -> m i k c
icomp f g = \ a -> ibind (g a) f

और, हमेशा की तरह, कानून वास्तव में यह सुनिश्चित करते हैं ireturnऔर icompहमें एक श्रेणी देते हैं

      ireturn `icomp` g = g
      f `icomp` ireturn = f
(f `icomp` g) `icomp` h = f `icomp` (g `icomp` h)

या, कॉमेडी में नकली सी / जावा / जो भी हो,

      g(); skip = g()
      skip; f() = f()
{g(); h()}; f() = h(); {g(); f()}

क्यों परेशान? बातचीत के "नियम" को लागू करने के लिए। उदाहरण के लिए, यदि आप ड्राइव में एक नहीं हैं, तो आप एक डीवीडी को नहीं निकाल सकते हैं, और यदि आप पहले से ही इसमें मौजूद हैं तो आप डीवीडी को ड्राइव में नहीं डाल सकते। इसलिए

data DVDDrive :: Bool -> Bool -> * -> * where  -- Bool is "drive full?"
  DReturn :: a -> DVDDrive i i a
  DInsert :: DVD ->                   -- you have a DVD
             DVDDrive True k a ->     -- you know how to continue full
             DVDDrive False k a       -- so you can insert from empty
  DEject  :: (DVD ->                  -- once you receive a DVD
              DVDDrive False k a) ->  -- you know how to continue empty
             DVDDrive True k a        -- so you can eject when full

instance IxMonad DVDDrive where  -- put these methods where they need to go
  ireturn = DReturn              -- so this goes somewhere else
  ibind (DReturn a)     k  = k a
  ibind (DInsert dvd j) k  = DInsert dvd (ibind j k)
  ibind (DEject j)      k  = DEject j $ \ dvd -> ibind (j dvd) k

इसके स्थान पर, हम "आदिम" कमांड को परिभाषित कर सकते हैं

dInsert :: DVD -> DVDDrive False True ()
dInsert dvd = DInsert dvd $ DReturn ()

dEject :: DVDrive True False DVD
dEject = DEject $ \ dvd -> DReturn dvd

जिसमें से अन्य लोगों के साथ इकट्ठे होते हैं ireturnऔर ibind। अब, मैं लिख सकता हूँ (उधार- doभुगतान)

discSwap :: DVD -> DVDDrive True True DVD
discSwap dvd = do dvd' <- dEject; dInsert dvd ; ireturn dvd'

लेकिन शारीरिक रूप से असंभव नहीं है

discSwap :: DVD -> DVDDrive True True DVD
discSwap dvd = do dInsert dvd; dEject      -- ouch!

वैकल्पिक रूप से, कोई व्यक्ति किसी आदिम कमांड को सीधे परिभाषित कर सकता है

data DVDCommand :: Bool -> Bool -> * -> * where
  InsertC  :: DVD -> DVDCommand False True ()
  EjectC   :: DVDCommand True False DVD

और फिर जेनेरिक टेम्प्लेट को तत्काल करें

data CommandIxMonad :: (state -> state -> * -> *) ->
                        state -> state -> * -> * where
  CReturn  :: a -> CommandIxMonad c i i a
  (:?)     :: c i j a -> (a -> CommandIxMonad c j k b) ->
                CommandIxMonad c i k b

instance IxMonad (CommandIxMonad c) where
  ireturn = CReturn
  ibind (CReturn a) k  = k a
  ibind (c :? j)    k  = c :? \ a -> ibind (j a) k

वास्तव में, हमने कहा है कि आदिम क्लेसीली तीर क्या हैं (एक "डोमिनो" क्या है), फिर उनके ऊपर "गणना अनुक्रम" की एक उपयुक्त धारणा बनाई।

ध्यान दें कि प्रत्येक अनुक्रमित मोनाड के लिए m, "कोई परिवर्तन विकर्ण नहीं" m i iएक सनक है, लेकिन सामान्य रूप से, m i jनहीं है। इसके अलावा, मूल्यों को अनुक्रमित नहीं किया जाता है, लेकिन संगणनों को अनुक्रमित किया जाता है, इसलिए एक अनुक्रमित मोनाड किसी अन्य श्रेणी के लिए मोनाड तत्काल का सामान्य विचार नहीं है।

अब, फिर से क्लीसली तीर के प्रकार को देखें

a -> m i j b

हम जानते हैं कि हमें iशुरू करने के लिए राज्य में होना चाहिए , और हम भविष्यवाणी करते हैं कि कोई भी निरंतरता राज्य से शुरू होगी j। हम इस प्रणाली के बारे में बहुत कुछ जानते हैं! यह एक जोखिम भरा ऑपरेशन नहीं है! जब हम डीवीडी को ड्राइव में डालते हैं, तो यह अंदर चला जाता है! प्रत्येक कमांड के बाद राज्य में डीवीडी ड्राइव का कोई मतलब नहीं है।

लेकिन यह सामान्य रूप से सच नहीं है, जब दुनिया के साथ बातचीत करते हैं। कभी-कभी आपको कुछ नियंत्रण छोड़ने की ज़रूरत होती है और दुनिया को वही करना चाहिए जो उसे पसंद है। उदाहरण के लिए, यदि आप एक सर्वर हैं, तो आप अपने ग्राहक को एक विकल्प प्रदान कर सकते हैं, और आपका सत्र राज्य इस बात पर निर्भर करेगा कि वे क्या चुनते हैं। सर्वर का "प्रस्ताव पसंद" ऑपरेशन परिणामी स्थिति को निर्धारित नहीं करता है, लेकिन सर्वर को वैसे भी ले जाने में सक्षम होना चाहिए। यह उपरोक्त अर्थों में एक "आदिम कमांड" नहीं है, इसलिए अनपेक्षित परिदृश्य को मॉडल करने के लिए अनुक्रमित भिक्षु इतने अच्छे उपकरण नहीं हैं।

एक बेहतर उपकरण क्या है?

type f :-> g = forall state. f state -> g state

class MonadIx (m :: (state -> *) -> (state -> *)) where
  returnIx    :: x :-> m x
  flipBindIx  :: (a :-> m b) -> (m a :-> m b)  -- tidier than bindIx

डरावना बिस्कुट? वास्तव में नहीं, दो कारणों से। एक, यह, क्या एक इकाई है की तरह नहीं बल्कि अधिक लग रहा है, क्योंकि यह है एक इकाई है, लेकिन अधिक (state -> *)के बजाय *। दो, यदि आप क्लेस्ली तीर के प्रकार को देखते हैं,

a :-> m b   =   forall state. a state -> m b state

आप एक पुराने पूर्व a संस्मरण की bतरह एक पूर्व शर्त और पोस्टकंडिशन के साथ अभिकलन के प्रकार प्राप्त करते हैं । करी-हावर्ड पत्राचार को पार करने और हास्केल प्रकार बनने के लिए कार्यक्रम लॉजिक्स में जोर आधी सदी के भीतर लिया गया है। इस प्रकार का returnIxकहना है "आप किसी भी पोस्टकॉन्डिशन को प्राप्त कर सकते हैं, जो कि कुछ भी करने से बस पकड़ता है", जो कि "स्किप" के लिए होरे लॉजिक नियम है। संबंधित संरचना "," के लिए होएर लॉजिक नियम है।

आइए bindIx, सभी मात्राओं को अंदर डालते हुए , इसके प्रकार को देखें ।

bindIx :: forall i. m a i -> (forall j. a j -> m b j) -> m b i

ये forallविपरीत ध्रुवीयता रखते हैं। हम प्रारंभिक स्थिति चुनते हैं i, और एक संगणना जो iपोस्टकॉन्डिशन के साथ शुरू हो सकती है a। दुनिया किसी भी मध्यवर्ती राज्य को चुनती jहै जिसे वह पसंद करता है, लेकिन यह हमें सबूत देना चाहिए कि पोस्टकॉन्डिशन bरखती है, और ऐसे किसी भी राज्य से हम bपकड़ बनाने के लिए आगे बढ़ सकते हैं। तो, क्रम में, हम bराज्य से स्थिति प्राप्त कर सकते हैं i। "के बाद" राज्यों पर अपनी पकड़ जारी करके, हम अप्रत्याशित गणना कर सकते हैं ।

दोनों IxMonadऔर MonadIxउपयोगी हैं। क्रमशः बदलते राज्य, पूर्वानुमेय और अप्रत्याशित, के संबंध में संवादात्मक संगणना की दोनों मॉडल वैधता। जब आप इसे प्राप्त कर सकते हैं तो पूर्वनिर्धारणता मूल्यवान है, लेकिन अप्रत्याशितता कभी-कभी जीवन का एक तथ्य है। उम्मीद है, तब, यह जवाब कुछ संकेत देता है कि अनुक्रमित भिक्षु क्या हैं, दोनों की भविष्यवाणी करते हुए कि वे कब उपयोगी होना शुरू करते हैं और कब रुकते हैं।


1
आप True/ Falseतर्कों को प्रकार तर्क के रूप में कैसे पारित कर सकते हैं DVDDrive? क्या कुछ विस्तार है, या बूलियंस वास्तव में यहां टाइप हैं?
बर्गी

8
@Bergi प्रकार स्तर पर मौजूद होने के लिए बूलियन्स को "उठा लिया गया" है। हास्केल में DataKindsविस्तार का उपयोग करके और भरोसेमंद रूप से टाइप की गई भाषाओं में यह संभव है ... अच्छी तरह से, यह पूरी तरह से है।
जे। अब्राहमसन

क्या आप थोड़ा विस्तार कर सकते हैं MonadIx, शायद उदाहरणों के साथ? क्या यह सैद्धांतिक आधार पर बेहतर है, या व्यावहारिक अनुप्रयोग के लिए बेहतर है?
क्रिश्चियन कोंकले

2
@ChristianConkle मुझे लगता है कि बहुत मददगार नहीं है। लेकिन आप उठाते हैं कि वास्तव में एक अन्य प्रश्न क्या है। स्थानीय रूप से जब मैं कहता हूं कि मोनडाइक्स "बेहतर" है, तो मेरा मतलब है कि अप्रत्याशित वातावरण के साथ मॉडलिंग की बातचीत। जैसे अगर आपकी डीवीडी ड्राइव को डीवीडी बाहर थूकने की अनुमति है, तो यह पसंद नहीं है जब आप उन्हें डालने की कोशिश करते हैं। कुछ व्यावहारिक परिस्थितियां उतनी ही बुरी तरह से व्यवहार की जाती हैं। दूसरों के पास अधिक पूर्वानुमान है (मतलब आप कह सकते हैं कि किस स्थिति में कोई निरंतरता शुरू होती है, न कि संचालन विफल होता है), जिस स्थिति में IxMonad के साथ काम करना आसान है।
सुअर का बच्चा

1
जब आप उत्तर में नोटेशन को "उधार" लेते हैं, तो यह कहना उपयोगी हो सकता है कि यह वास्तव में RebindableSyntaxविस्तार के साथ मान्य सिंटैक्स है । अन्य आवश्यक एक्सटेंशन का उल्लेख अच्छा होगा, जैसे उपरोक्तDataKinds
गीगाबाइट्स

46

एक अनुक्रमित सन्यासी को परिभाषित करने के लिए कम से कम तीन तरीके हैं जो मुझे पता है।

मैं इन विकल्पों को अनुक्रमित मोनड्स ला ला एक्स के रूप में संदर्भित करता हूं , जहां एक्स कंप्यूटर वैज्ञानिकों बॉब एटकी, कॉनर मैकब्राइड और डोमिनिक ऑर्चर्ड के ऊपर है, जैसा कि मैं उनके बारे में सोचता हूं। इन निर्माणों के कुछ हिस्सों में श्रेणी सिद्धांत के माध्यम से बहुत अधिक शानदार इतिहास और अच्छे व्याख्याएं हैं, लेकिन मैंने पहली बार इन नामों से जुड़ा हुआ सीखा है, और मैं इस उत्तर को बहुत गूढ़ होने से रोकने की कोशिश कर रहा हूं ।

Atkey

इंडेक्सेड मोनाड की बॉब अटकी की शैली मोनाड के सूचकांक से निपटने के लिए 2 अतिरिक्त मापदंडों के साथ काम करना है।

इससे आपको पता चलता है कि लोगों को अन्य उत्तरों में इधर-उधर फेंक दिया गया है:

class IMonad m where
  ireturn  ::  a -> m i i a
  ibind    ::  m i j a -> (a -> m j k b) -> m i k b

हम अनुक्रमित कोमोनॉड्स ए ला एटकी को भी परिभाषित कर सकते हैं। मैं वास्तव में lensकोडबेस में उन लोगों से बहुत अधिक लाभ प्राप्त करता हूं ।

मैकब्राइड

अनुक्रमित मोनाड का अगला रूप कोनोर मैकब्राइड की परिभाषा उनके पेपर "क्लेरीली एरो ऑफ आउटेजेज फॉर्च्यून" से है । इसके बजाय वह इंडेक्स के लिए एकल पैरामीटर का उपयोग करता है। यह बनाता है अनुक्रमित monad परिभाषा के बजाय एक चतुर आकार है।

यदि हम निम्नानुसार पैरामीट्रिकिटी का उपयोग करते हुए एक प्राकृतिक परिवर्तन को परिभाषित करते हैं

type a ~> b = forall i. a i -> b i 

तब हम McBride की परिभाषा को नीचे लिख सकते हैं

class IMonad m where
  ireturn :: a ~> m a
  ibind :: (a ~> m b) -> (m a ~> m b)

यह अटकी की तुलना में काफी अलग लगता है, लेकिन यह एक सामान्य मोनाड की तरह अधिक महसूस करता है, एक मोनाड के निर्माण के बजाय (m :: * -> *), हम इसे बनाते हैं (m :: (k -> *) -> (k -> *)

दिलचस्प बात यह है कि आप वास्तव में एक चतुर डेटा प्रकार का उपयोग करके मैकबाइड से अनुक्रमित मोनाद की अटकी की शैली को पुनर्प्राप्त कर सकते हैं, जो कि मैकबीराइड अपनी अतुलनीय शैली में यह कहना चाहता है कि आपको "कुंजी पर" पढ़ना चाहिए।

data (:=) :: a i j where
   V :: a -> (a := i) i

अब आप यह काम कर सकते हैं

ireturn :: IMonad m => (a := j) ~> m (a := j)

जिसका विस्तार होता है

ireturn :: IMonad m => (a := j) i -> m (a := j) i

केवल j = i पर ही आह्वान किया जा सकता है, और तब सावधानीपूर्वक पढ़ने से ibindआपको Atkey के समान वापस मिल सकता है ibind। आपको इन (: =) डेटा संरचनाओं के आसपास से गुजरने की आवश्यकता है, लेकिन वे एटिकी प्रस्तुति की शक्ति को पुनर्प्राप्त करते हैं।

दूसरी ओर, Atkey प्रस्तुति मैकब्राइड के संस्करण के सभी उपयोगों को पुनर्प्राप्त करने के लिए पर्याप्त मजबूत नहीं है। शक्ति को सख्ती से प्राप्त किया गया है।

एक और अच्छी बात यह है कि मैकब्राइड का अनुक्रमित मोनाड स्पष्ट रूप से एक सन्यासी है, यह एक अलग फ़नकार की श्रेणी में सिर्फ एक मोनाड है। यह फंक्शंस की श्रेणी से एंडोफंक्टर्स पर काम (k -> *)करने के (k -> *)बजाय फंक्शनल की श्रेणी से काम करता *है *

एक मजेदार व्यायाम यह पता लगा रहा है कि अनुक्रमित कोमोनैड्स के लिए मैकब्रीड टू एटकी रूपांतरण कैसे करें । मैं व्यक्तिगत रूप से मैकब्राइड के पेपर में "एट" कुंजी के निर्माण के लिए एक डेटा प्रकार 'एट' का उपयोग करता हूं। मैं वास्तव में ICFP 2013 में बॉब एटकी तक गया और उल्लेख किया कि मैंने उसे "कोट" में बनाया। वह नेत्रहीन परेशान लग रहा था। रेखा ने मेरे सिर में बेहतर खेला। =)

ऑर्चर्ड

अंत में, "अनुक्रमित मोनाड" के नाम से एक तिहाई दूर-कम-संदर्भित दावेदार डोमिनिक ऑर्चर्ड के कारण है, जहां वह एक प्रकार के स्तर के मोनोइड का उपयोग एक साथ सूचकांकों को नष्ट करने के लिए करता है। निर्माण के विवरण के माध्यम से जाने के बजाय, मैं बस इस बात से जुड़ा हूँ:

https://github.com/dorchard/effect-monad/blob/master/docs/ixmonad-fita14.pdf


1
क्या मैं सही हूं कि ऑर्चर्ड का मोनाद एटकी के बराबर है, क्योंकि हम एंडोमोर्फिज्म मोनॉयड लेकर पूर्व से उत्तरार्द्ध में जा सकते हैं, और सीपीएस एनकोडिंग द्वारा पीछे की ओर जा सकते हैं जो राज्य संक्रमण में संलग्न है?
आंद्र कोवक्स

जो मुझे बहुत अच्छा लगता है।
एडवर्ड KMETT

उन्होंने कहा कि ICFP 2013 में उन्होंने मुझसे जो कुछ कहा था, उसके आधार पर, मेरा मानना ​​है कि ऑर्चर्ड ने अपने प्रकार के परिवारों को एक मनमाना श्रेणी के बजाय एक वास्तविक मोनॉयड की तरह काम करने का इरादा किया, जहां कुछ तीर कनेक्ट नहीं कर सकते हैं, इसलिए कहानी के लिए और भी कुछ हो सकता है उस से भी, जैसा कि एटक का निर्माण आपको आसानी से कुछ क्लिसली कार्यों को दूसरों के साथ जुड़ने से प्रतिबंधित करता है - कई मायनों में जो कि इसके और मैकब्राइड के संस्करण का बहुत बिंदु है।
एडवर्ड KMETT

2
"सावधान पढ़ने" पर विस्तार करने के लिए ibind: प्रकार उपनाम का परिचय दें Atkey m i j a = m (a := j) imएटिकी की परिभाषा में इसका उपयोग करते हुए हम उन दो हस्ताक्षरों को पुनः प्राप्त करते हैं जो हम खोजते हैं: ireturnAtkin :: a -> m (a := i) iऔर ibindAtkin :: m (a := j) i -> (a -> m (b := k) j) -> m (b := k) i। पहली रचना के द्वारा प्राप्त की जाती है ireturn . V:। दूसरा (1) forall j. (a := j) j -> m (b := k) jपैटर्न मिलान द्वारा एक फ़ंक्शन का निर्माण करना , फिर पुनर्प्राप्त aकरना दूसरे तर्क के पास ibindAtkin
WorldSEnder

23

एक साधारण परिदृश्य के रूप में, मान लीजिए कि आपके पास एक राज्य का एक मठ है। राज्य प्रकार एक जटिल बड़ा है, फिर भी इन सभी राज्यों को दो सेटों में विभाजित किया जा सकता है: लाल और नीला राज्य। इस मोनाड में कुछ संचालन केवल तभी समझ में आते हैं जब वर्तमान स्थिति एक नीला राज्य है। इनमें से कुछ राज्य को नीला रखेंगे ( blueToBlue), जबकि अन्य राज्य को लाल बनाएंगे ( blueToRed)। एक नियमित मोनाड में, हम लिख सकते थे

blueToRed  :: State S ()
blueToBlue :: State S ()

foo :: State S ()
foo = do blueToRed
         blueToBlue

दूसरी कार्रवाई के बाद से एक रनटाइम त्रुटि को ट्रिगर करना एक नीले राज्य की अपेक्षा करता है। हम इसे वैधानिक रूप से रोकना चाहेंगे। अनुक्रमित मोनाड इस लक्ष्य को पूरा करता है:

data Red
data Blue

-- assume a new indexed State monad
blueToRed  :: State S Blue Red  ()
blueToBlue :: State S Blue Blue ()

foo :: State S ?? ?? ()
foo = blueToRed `ibind` \_ ->
      blueToBlue          -- type error

एक प्रकार की त्रुटि शुरू हो रहा है क्योंकि के दूसरे सूचकांक है blueToRed( Red) के पहले सूचकांक से अलग है blueToBlue( Blue)।

एक अन्य उदाहरण के रूप में, अनुक्रमित भिक्षुओं के साथ आप किसी राज्य के सन्यासी को उसके राज्य के प्रकार को बदलने की अनुमति दे सकते हैं, जैसे कि आपके पास हो सकता है

data State old new a = State (old -> (new, a))

आप राज्य का निर्माण करने के लिए उपर्युक्त का उपयोग कर सकते हैं जो एक सांख्यिकीय-टाइप विषम ढेर है। ऑपरेशन टाइप होते

push :: a -> State old (a,old) ()
pop  :: State (a,new) new a

एक अन्य उदाहरण के रूप में, मान लीजिए कि आप एक प्रतिबंधित IO मोनाद चाहते हैं जो फ़ाइल एक्सेस की अनुमति नहीं देता है। आप उदाहरण के लिए उपयोग कर सकते हैं

openFile :: IO any FilesAccessed ()
newIORef :: a -> IO any any (IORef a)
-- no operation of type :: IO any NoAccess _

इस तरह, एक प्रकार की क्रिया IO ... NoAccess ()को फ़ाइल-एक्सेस-मुक्त होने की गारंटी है। इसके बजाय, प्रकार की एक कार्रवाई IO ... FilesAccessed ()फ़ाइलों तक पहुंच सकती है। अनुक्रमित मॉनेड होने का मतलब होगा कि आपको प्रतिबंधित IO के लिए एक अलग प्रकार का निर्माण नहीं करना होगा, जिसके लिए दोनों IO प्रकारों में प्रत्येक गैर-फ़ाइल-संबंधित फ़ंक्शन को डुप्लिकेट करना होगा।


18

एक अनुक्रमित सन्यासी एक विशिष्ट सन्यासी नहीं होता है, उदाहरण के लिए, राजकीय मोनाड लेकिन अतिरिक्त प्रकार के मापदंडों के साथ मोनाड अवधारणा के सामान्यीकरण का एक प्रकार है।

जबकि एक "मानक" मोनैडिक मान का प्रकार Monad m => m aइंडेक्सेड मोनड में एक मान होता है, IndexedMonad m => m i j aजहां इंडेक्स प्रकार होते हैं iऔर jइसलिए इंडेक्स के प्रकार iको मॉनेडिक गणना की शुरुआत में और गणना jके अंत में टाइप किया जाता है। एक तरह से, आप iएक प्रकार के इनपुट प्रकार और jआउटपुट प्रकार के रूप में सोच सकते हैं ।

Stateएक उदाहरण के रूप में उपयोग करते हुए , एक स्टेटफुल कंप्यूटेशन पूरे कंप्‍यूटेशन State s aमें टाइप की स्थिति बनाए रखता है sऔर टाइप का परिणाम देता है a। एक अनुक्रमित संस्करण, IndexedState i j aएक स्टेटफुल कम्प्यूटेशन है जहां कम्प्यूटेशन के दौरान राज्य एक अलग प्रकार में बदल सकते हैं। प्रारंभिक अवस्था में प्रकार iऔर अवस्था होती है और गणना के अंत में प्रकार होता है j

एक सामान्य मोनाड पर अनुक्रमित मोनाड का उपयोग करना शायद ही कभी आवश्यक होता है लेकिन इसका उपयोग कुछ मामलों में कड़े स्थैतिक गारंटी देने के लिए किया जा सकता है।


5

यह देखना महत्वपूर्ण हो सकता है कि निर्भर प्रकारों में अनुक्रमण का उपयोग कैसे किया जाता है (जैसे कि एजडा में)। यह समझा सकता है कि कैसे अनुक्रमण सामान्य रूप से मदद करता है, फिर इस अनुभव को मोनाड्स में अनुवाद करें।

अनुक्रमण विशेष प्रकार के उदाहरणों के बीच संबंध स्थापित करने की अनुमति देता है। फिर आप कुछ मूल्यों को स्थापित करने के बारे में तर्क कर सकते हैं कि क्या संबंध है।

उदाहरण के लिए (agda में) आप यह निर्दिष्ट कर सकते हैं कि कुछ प्राकृतिक संख्याएँ संबंधित हैं _<_, और प्रकार बताता है कि वे कौन सी संख्याएँ हैं। फिर आपको आवश्यकता हो सकती है कि कुछ फ़ंक्शन को एक गवाह दिया जाता है m < n, क्योंकि केवल तब फ़ंक्शन सही ढंग से काम करता है - और इस तरह के गवाह प्रदान किए बिना कार्यक्रम संकलित नहीं करेगा।

एक अन्य उदाहरण के रूप में, आपकी चुनी हुई भाषा के लिए पर्याप्त दृढ़ता और संकलक समर्थन दिया गया है, आप यह मान सकते हैं कि फ़ंक्शन मानता है कि एक निश्चित सूची को क्रमबद्ध किया गया है।

अनुक्रमित मोनैड्स कुछ निर्भर प्रकार के सिस्टम को एनकोड करने की अनुमति देते हैं, जिससे साइड इफेक्ट का अधिक सटीक प्रबंधन किया जा सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.