मुक्त मोनाड क्या हैं?


368

मैंने देखा है अवधि नि: शुल्क इकाई पॉप अप हर अब और फिर कुछ समय के लिए, लेकिन हर किसी बस का उपयोग / वे क्या कर रहे हैं की एक विवरण दिए बिना उन पर चर्चा करने लगता है। तो: क्या मुक्त मुनि हैं? (मैं कहूंगा कि मैं भिक्षुओं और हास्केल मूल बातें से परिचित हूं, लेकिन केवल श्रेणी सिद्धांत का बहुत मोटा ज्ञान है।)


12
एक काफी अच्छी व्याख्या यहाँ है haskellforall.com/2012/06/…
रोजर लिंड्सजॉ

19
@Roger उस पेज की तरह है जो मुझे यहां लाया है। मेरे लिए, वह उदाहरण "फ्री" नामक एक प्रकार के लिए एक मोनड उदाहरण को परिभाषित करता है और यह बात है।
डेविड

जवाबों:


295

एडवर्ड केमट का उत्तर स्पष्ट रूप से महान है। लेकिन, यह थोड़ा तकनीकी है। यहाँ एक और अधिक सुलभ व्याख्या है।

नि: शुल्क भिक्षुओं केवल साधुओं में तब्दील होने का एक सामान्य तरीका है। यानी किसी भी फनकार को दिया गयाf Free f को एक सन्यासी कहा जाता है। यह बहुत उपयोगी नहीं होगा, सिवाय इसके कि आपको कार्यों की एक जोड़ी मिल जाए

liftFree :: Functor f => f a -> Free f a
foldFree :: Functor f => (f r -> r) -> Free f r -> r

इनमें से पहला आपको "आपके सन्यासी" में मिलता है, और दूसरा आपको "इससे बाहर निकलने" का रास्ता देता है।

अधिक आम तौर पर, यदि X कुछ अतिरिक्त सामान P के साथ Y है, तो एक "मुक्त X", बिना कुछ अतिरिक्त प्राप्त किए Y से X प्राप्त करने का एक तरीका है।

उदाहरण: एक मोनॉइड (X) अतिरिक्त संरचना (P) के साथ एक सेट (Y) है जो मूल रूप से कहता है कि इसमें एक ऑपरेशन है (आप इसके अलावा सोच सकते हैं) और कुछ पहचान (जैसे शून्य)।

इसलिए

class Monoid m where
   mempty  :: m
   mappend :: m -> m -> m

अब, हम सभी सूचियों को जानते हैं

data [a] = [] | a : [a]

खैर, किसी भी प्रकार को देखते हुए tहम जानते हैं कि [t]एक मोनॉयड है

instance Monoid [t] where
  mempty   = []
  mappend = (++)

और इसलिए सूची सेट्स पर (या हास्केल प्रकारों में) "फ्री मोनॉयड" हैं।

ठीक है, इसलिए मुफ्त मोनाड एक ही विचार हैं। हम एक फ़नकार लेते हैं, और एक मोनाड वापस देते हैं। वास्तव में, चूंकि मोनोड को एंडोफुन्क्टरों की श्रेणी में मोनॉयड के रूप में देखा जा सकता है, एक सूची की परिभाषा

data [a] = [] | a : [a]

मुक्त साधुओं की परिभाषा के समान है

data Free f a = Pure a | Roll (f (Free f a))

और उदाहरण के लिए सूचियों Monadके Monoidउदाहरण में समानता है

--it needs to be a functor
instance Functor f => Functor (Free f) where
  fmap f (Pure a) = Pure (f a)
  fmap f (Roll x) = Roll (fmap (fmap f) x)

--this is the same thing as (++) basically
concatFree :: Functor f => Free f (Free f a) -> Free f a
concatFree (Pure x) = x
concatFree (Roll y) = Roll (fmap concatFree y)

instance Functor f => Monad (Free f) where
  return = Pure -- just like []
  x >>= f = concatFree (fmap f x)  --this is the standard concatMap definition of bind

अब, हमें अपने दो ऑपरेशन मिलेंगे

-- this is essentially the same as \x -> [x]
liftFree :: Functor f => f a -> Free f a
liftFree x = Roll (fmap Pure x)

-- this is essentially the same as folding a list
foldFree :: Functor f => (f r -> r) -> Free f r -> r
foldFree _ (Pure a) = a
foldFree f (Roll x) = f (fmap (foldFree f) x)

12
यह "मुक्त" मैंने अभी तक देखा है का सबसे अच्छा स्वीकार्य विवरण हो सकता है। विशेष रूप से पैराग्राफ "अधिक सामान्यतः" के साथ शुरू होता है।
जॉन एल

16
मुझे लगता है कि इस पर गौर करने के लिए दिलचस्प है Free f a = Pure a | Roll (f (Free f a))के रूप में Free f a = a + fa + ffa + ..., यानी "च कई बार किसी भी संख्या के लिए आवेदन किया"। तब concatFree(यानी join) किसी भी समय "एफ लागू किसी भी संख्या में लागू होता है (एफ किसी भी समय कई बार लागू होता है)" और एक में दो नेस्टेड अनुप्रयोगों को ढह जाता है। और >>="f ने किसी भी संख्या को कई बार लागू किया है" और "a से प्राप्त करने के लिए कैसे (b के साथ f (किसी भी समय की संख्या को लागू किया जाता है)", और मूल रूप से पूर्व के अंदर एक उत्तरार्द्ध को लागू करता है और नेस्टिंग को ढहता है। अब मैं खुद इसे प्राप्त करता हूं!
jkff

1
है concatFreeमूल रूप से join?
रैनगिनबर्ग

11
“यहाँ एक और अधिक सुलभ व्याख्या है। […] वास्तव में, चूंकि मोनोड को एंडो फंक्शनलर्स की श्रेणी में मोनॉयड के रूप में देखा जा सकता है,… ”फिर भी, मुझे लगता है कि यह एक बहुत अच्छा जवाब है।
रुद

2
"मोनोड को एंडो फंक्शनलर्स की श्रेणी में मोनोइड्स के रूप में देखा जा सकता है" <3 (आपको stackoverflow.com/a/3870310/1306877 से लिंक करना चाहिए क्योंकि हर हैकर को उस संदर्भ के बारे में पता होना चाहिए!)
tul

418

यहाँ एक और भी सरल उत्तर दिया गया है: एक मोनाड एक ऐसी चीज है जो "गणना" करता है जब मोनैडिक संदर्भ को ढह जाता है join :: m (m a) -> m a(यह याद करते हुए कि >>=इसे परिभाषित किया जा सकता है x >>= y = join (fmap y x))। मोनाड्स इस तरह से संगणना की क्रमिक श्रृंखला के माध्यम से संदर्भ लेते हैं: क्योंकि श्रृंखला के प्रत्येक बिंदु पर, पिछली कॉल का संदर्भ अगले के साथ ढह जाता है।

एक नि: शुल्क मोनाड सभी मोनाड कानूनों को संतुष्ट करता है, लेकिन कोई भी पतन (यानी, गणना) नहीं करता है। यह सिर्फ संदर्भों की एक नेस्टेड श्रृंखला बनाता है। जो उपयोगकर्ता इस तरह के मुक्त मानदंड का निर्माण करता है, उन नेस्टेड संदर्भों के साथ कुछ करने के लिए जिम्मेदार होता है, ताकि इस तरह की रचना का अर्थ तब तक सुरक्षित रखा जा सके जब तक कि मानदिक मूल्य नहीं बनाया जाता है।


8
आपके पैराग्राफ फिलिप की पोस्ट के लिए एक बहुत अच्छा जोड़ बनाते हैं।
डेविड

20
मुझे वास्तव में यह उत्तर पसंद है।
danidiaz

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

2
इस उत्तर ने मदद की, लेकिन मुझे लगता है कि यह उलझन में होगा कि मैं NICTA पाठ्यक्रम पर 'join' से नहीं मिला था और haskellforall.com/2012/06/… को पढ़ा था । इसलिए मेरे लिए, समझने की चाल बहुत सारे उत्तरों को पढ़ने में है, जब तक कि वह डूब न जाए। (NICTA संदर्भ: github.com/NICTA/course/blob/master/src/Course/Bind.hs )
मार्टिन कैपोडिसी

1
यह उत्तर अब तक का सबसे अच्छा है
करिचु

142

एक फ्री फू सबसे सरल बात है जो सभी 'फू' कानूनों को संतुष्ट करती है। यह कहना है कि यह वास्तव में एक फू होने के लिए आवश्यक कानूनों को संतुष्ट करता है और कुछ भी अतिरिक्त नहीं है।

एक भुलक्कड़ फ़नकार वह है जो संरचना का एक हिस्सा "भूल जाता है" क्योंकि यह एक श्रेणी से दूसरी श्रेणी में जाता है।

यह देखते हुए कि फंक्शनलर्स F : D -> C, और G : C -> D, हम कहते हैं F -| G, जब भी ए, बी: आइसोमोर्फिक है , जहां उपयुक्त श्रेणियों से तीर आते हैं , के Fलिए आसन्न छोड़ दिया जाता है G, या Gसही Fनिकटवर्ती है ।F a -> ba -> G b

औपचारिक रूप से, एक मुक्त फ़नकार को एक भुलक्कड़ फ़नकार के निकट छोड़ दिया जाता है।

फ्री मोनॉयड

आइए हम एक सरल उदाहरण के साथ शुरू करते हैं, मुक्त मोनोइड।

एक मोनॉइड लें, जिसे कुछ वाहक सेट द्वारा परिभाषित किया गया है T, एक जोड़ी तत्वों को एक साथ मैश करने के लिए एक बाइनरी फ़ंक्शन f :: T → T → T, और एक unit :: T, जैसे कि आपके पास एक सहयोगी कानून और एक पहचान कानून है f(unit,x) = x = f(x,unit):।

आप Uमोनॉइड्स की श्रेणी से एक फ़नकार बना सकते हैं (जहाँ तीर मोनोइड होमोमोर्फिज्म होते हैं, यानी वे दूसरे मोनोइड पर मैप unitको सुनिश्चित करते हैं unit, और यह कि आप अन्य मोनॉइड को मैप करने से पहले या बाद में कंपोज़ कर सकते हैं, मतलब बिना श्रेणी में आए) सेट के सेट (जहां तीर केवल फ़ंक्शन तीर हैं) ऑपरेशन के बारे में 'भूल जाते हैं' unitऔर बस आपको वाहक सेट देता है।

फिर, आप एक फ़नकार Fको सेट्स की श्रेणी से वापस उन मन्त्रों की श्रेणी में परिभाषित कर सकते हैं जो इस फ़नकार से सटे हुए हैं। वह फ़नकार वह फ़नकार है जो एक सेट aको मोनॉइड [a], जहाँ unit = []और, पर मैप करता है mappend = (++)

छद्म-हास्केल में अब तक हमारे उदाहरण की समीक्षा करने के लिए:

U : Mon  Set -- is our forgetful functor
U (a,mappend,mempty) = a

F : Set  Mon -- is our free functor
F a = ([a],(++),[])

फिर दिखाने के Fलिए स्वतंत्र है, हमें यह प्रदर्शित करने की आवश्यकता है कि यह Uएक विपर्यय फ़नकार के निकट है, जैसा कि हमने ऊपर बताया है, हमें यह दिखाने की आवश्यकता है

F a → b isomorphic to है a → U b

अब, लक्ष्य को याद रखें कि Fयह Monमोनॉयड की श्रेणी में है, जहां तीर मोनोइड होमोमोर्फिज्म हैं, इसलिए हमें यह दिखाने की आवश्यकता है कि एक मोनोइड होमोर्फिज्म से [a] → bएक फ़ंक्शन द्वारा ठीक वर्णित किया जा सकता है a → b

हास्केल में, हम इस पक्ष को कहते हैं जो Set(एर,, Haskहास्केल प्रकारों की श्रेणी, जिसे हम दिखावा करते हैं, सेट है), बस foldMap, जिसे जब Data.Foldableसूचियों से विशेष प्रकार में टाइप किया जाता है Monoid m => (a → m) → [a] → m

वहाँ परिणाम है कि इस से एक सहायक होने का पालन कर रहे हैं। विशेष रूप से अगर आप भूल जाते हैं तो मुफ्त में निर्माण करें, फिर से भूल जाएं, जैसे कि आप एक बार भूल गए हैं, और हम इसका उपयोग कर सकते हैं बनाने के लिए मौद्रिक में शामिल हों। के बाद से UFUF~ U(FUF)~ UF, और हम पहचान monoid समरूपता में से पारित कर सकते हैं [a]करने के लिए [a]समाकृतिकता कि हमारे adjunction को परिभाषित करता है के माध्यम से, कि से एक सूची समाकृतिकता मिल [a] → [a]प्रकार की एक समारोह है a -> [a], और यह सिर्फ सूचियों के लिए लौट रहा है।

आप इन शब्दों में एक सूची का वर्णन करके इस सब को और अधिक सीधे लिख सकते हैं:

newtype List a = List (forall b. Monoid b => (a -> b) -> b)

फ्री मोनाड

तो फ्री मोनाड क्या है ?

ठीक है, हम वही काम करते हैं जो हमने पहले किया था, हम भिक्षुओं की श्रेणी से एक भुलक्कड़ फ़नकार यू के साथ शुरू करते हैं जहाँ तीर मोनोड होमोमोर्फिम्स हैं जो एंडोफ़ुन्क्टरों की श्रेणी में आते हैं जहाँ तीर प्राकृतिक परिवर्तन होते हैं, और हम एक ऐसे फ़ंक्टर की तलाश करते हैं जो बगल में छोड़ दिया जाता है उस से।

तो, यह एक मुफ्त मोनाड की धारणा से कैसे संबंधित है जैसा कि आमतौर पर उपयोग किया जाता है?

यह जानते हुए कि कुछ एक स्वतंत्र मोनाड है, Free fआपको बताता है कि Free f -> mएक प्राकृतिक परिवर्तन (एक फनकार होमोर्फिज्म) के रूप में एक मोनड होमोमोर्फिज्म से एक ही चीज़ (आइसोमॉर्फिक) है f -> m। याद रखें कि एफ के लिए F a -> bसमवर्ती होना चाहिए a -> U bयू को छोड़ दिया जाए।

एफ कम से कम आइसोमॉर्फिक है जिस Freeप्रकार मैं अपने freeपैकेज में हैकेज पर उपयोग करता हूं।

हम इसे परिभाषित करके नि: शुल्क सूची के लिए ऊपर दिए गए कोड के अनुरूप भी बना सकते हैं

class Algebra f x where
  phi :: f x -> x

newtype Free f a = Free (forall x. Algebra f x => (a -> x) -> x)

कॉफ्री कोमोनॉड्स

हम कुछ इसी तरह का निर्माण कर सकते हैं, यह मानते हुए कि एक भुलक्कड़ फ़नकार के लिए सही निकटता को देखते हुए। एक कॉफ़्री फ़ंक्टर बस / सही निकटवर्ती / एक भुलक्कड़ फ़नकार के लिए, और समरूपता द्वारा, कुछ जानना एक कॉफ़ी कॉमनॉड है, यह जानने के समान है कि कॉमनड होमोमोर्फिज़्म w -> Cofree fदेना एक प्राकृतिक परिवर्तन देने के समान है w -> f


12
@PauloScardine, इस कुछ भी नहीं तुम है है के बारे में चिंतित होने। मेरा प्रश्न कुछ उन्नत डेटा संरचना को समझने के लिए रुचि से आया है और हो सकता है कि हास्केल विकास में अभी क्या हो रहा है, इसकी एक झलक मिल रही है - यह किसी भी तरह से आवश्यक नहीं है या वास्तव में हास्केल के बारे में अब तक के लेखन के प्रतिनिधि हैं। (और एक सिर, यह बेहतर हो जाता है एक बार जब आप IO सीखने के चरण को फिर से पिछले कर रहे हैं)
डेविड

8
@PauloScardine आपको हास्केल में उत्पाद के कार्यक्रम के लिए उपरोक्त उत्तर की आवश्यकता नहीं है, यहां तक ​​कि मुफ्त मोनाड के साथ भी। वास्तव में, मैं इस तरह से मुफ्त मोनाड पर हमला करने की सिफारिश नहीं करूंगा, जिनके पास श्रेणी सिद्धांत में पृष्ठभूमि नहीं है। एक परिचालन दृष्टिकोण से इसके बारे में बात करने के बहुत सारे तरीके हैं और श्रेणी सिद्धांत में गोताखोरी के बिना एक का उपयोग करने के लिए कैसे करना है। हालांकि, मेरे लिए इस सवाल का जवाब देना असंभव है कि वे सिद्धांत में गोताखोरी के बिना कहां से आते हैं। नि: शुल्क निर्माण श्रेणी के सिद्धांत में एक शक्तिशाली उपकरण हैं, लेकिन आपको उनका उपयोग करने के लिए इस पृष्ठभूमि की आवश्यकता नहीं है।
एडवर्ड KMETT

18
@PauloScardine: आपको हास्केल का प्रभावी ढंग से उपयोग करने के लिए बिल्कुल गणना की आवश्यकता नहीं है और यहां तक ​​कि समझें कि आप क्या कर रहे हैं। यह शिकायत करना थोड़ा अजीब है कि "यह भाषा मैथी है" जब मैथनेस केवल अतिरिक्त अच्छाई है जिसे आप मज़े और लाभ के लिए उपयोग कर सकते हैं। आपको अधिकांश अनिवार्य भाषाओं में ये चीजें नहीं मिलती हैं। आप एक्स्ट्रा के बारे में शिकायत क्यों करेंगे? आप सिर्फ गणितीय रूप से तर्क करने का चुनाव नहीं कर सकते हैं, और इसे किसी अन्य नई भाषा की तरह अपना सकते हैं।
सारा

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

11
@PauloScardine यह थोड़ा ओटी बह रहा है, लेकिन हास्केल के बचाव में: इसी तरह की तकनीकी चीजें अन्य सभी प्रोग्रामिंग भाषाओं पर लागू होती हैं, केवल हास्केल में इतना अच्छा संकलन है कि लोग वास्तव में उनके बारे में बात करने का आनंद ले सकते हैं। क्यों / कैसे X एक सनक है कई लोगों के लिए दिलचस्प है, IEEE फ़्लोटिंग पॉइंट मानक के बारे में चर्चा नहीं की जाती है; दोनों मामले अधिकांश लोगों के लिए मायने नहीं रखते, क्योंकि वे सिर्फ परिणामों का उपयोग कर सकते हैं।
डेविड

72

मुक्त मोनाड (डेटा संरचना) मोनाड (वर्ग) की तरह है सूची (डेटा संरचना) की तरह मोनॉइड (वर्ग): यह तुच्छ कार्यान्वयन है, जहां आप बाद में तय कर सकते हैं कि सामग्री कैसे संयोजित होगी।


आप शायद जानते हैं कि एक मोनाड क्या है और प्रत्येक मोनाड को या तो fmap+ join+ returnया bind+ के एक विशिष्ट (मोनाड-कानून का पालन) कार्यान्वयन की आवश्यकता है return

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

यह नि: शुल्क मोनाड (डेटा संरचना) का उपयोग करके किया जा सकता है, जो joinफ़ंक्टर (प्रकार) को इस तरह से लपेटता है ताकि कमी के बजाय उन फ़ंक्शनलर्स का ढेर हो।

वास्तविक returnऔर joinआप का उपयोग करना चाहते हैं, अब कमी समारोह के लिए मापदंडों के रूप में दिया जा सकता है foldFree:

foldFree :: Functor f => (a -> b) -> (f b -> b) -> Free f a -> b
foldFree return join :: Monad m => Free m a -> m a

प्रकारों को समझाने के लिए, हम Functor fसाथ Monad mऔर bसाथ बदल सकते हैं(m a) :

foldFree :: Monad m => (a -> (m a)) -> (m (m a) -> (m a)) -> Free m a -> (m a)

8
इस जवाब ने मुझे यह धारणा दी कि मैं समझता हूं कि वे इसके लिए भी उपयोगी हो सकते हैं।
डेविड

59

एक हास्केल मुक्त मोनाद फंक्शंस की एक सूची है। की तुलना करें:

data List a   = Nil    | Cons  a (List a  )

data Free f r = Pure r | Free (f (Free f r))

Pureके अनुरूप है Nilऔर Freeके अनुरूप हैCons । एक मुफ्त मोनाड मानों की एक सूची के बजाय फंक्शनलर्स की एक सूची संग्रहीत करता है। तकनीकी रूप से, आप एक अलग डेटा प्रकार का उपयोग करके मुफ्त मोनाड को लागू कर सकते हैं, लेकिन किसी भी कार्यान्वयन को ऊपर वाले के लिए आइसोमोर्फिक होना चाहिए।

जब भी आपको एक सार वाक्यविन्यास वृक्ष की आवश्यकता होती है, तो आप मुफ्त साधुओं का उपयोग करते हैं। मुक्त मोनाड का बेस फंटर सिंटेक्स ट्री के प्रत्येक चरण का आकार है।

मेरी पोस्ट , जिसे कोई पहले से ही लिंक कर चुका है, कई उदाहरण देता है कि कैसे मुफ्त मोनाड के साथ सार सिंटैक्स पेड़ों का निर्माण किया जाए


6
मुझे पता है कि आप केवल एक परिभाषा बनाने के बजाय एक सादृश्य बना रहे थे, लेकिन एक मुक्त मोनाद किसी भी अर्थ में फंक्शनलर्स की सूची के अनुरूप नहीं है। यह फंक्शंस के एक पेड़ के बहुत करीब है।
टॉम एलिस

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

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

2
@TomEllis तकनीकी रूप से, यह केवल एक पेड़ है यदि आपका बेस फन्क्टर एक उत्पाद फ़नकार है। जब आपके पास बेस फंक्टर के रूप में एक राशि का फंक्शनल होता है तो यह एक स्टैक मशीन जैसा होता है।
गेब्रियल गोंजालेज

21

मुझे लगता है कि एक सरल ठोस उदाहरण से मदद मिलेगी। मान लीजिए हमारे पास एक फनकार है

data F a = One a | Two a a | Two' a a | Three Int a a a

स्पष्ट के साथ fmap। फिर Free F aपेड़ जिसका पत्ते प्रकार के प्रकार है aऔर जिसका नोड्स के साथ टैग कर रहे हैं One, Two, Two'और ThreeOne-nodes का एक बच्चा है, Two- और Two'-nodes के दो बच्चे हैं और Three-nodes के तीन हैं और उन्हें a के साथ टैग भी किया गया है Int

Free Fएक सन्यासी है। मूल्य के साथ सिर्फ एक पत्ता है कि पेड़ के लिए returnनक्शे । पत्तियों में से प्रत्येक को देखता है और उन्हें पेड़ों से बदल देता है। जब पत्ती का मूल्य होता है तो वह उस पत्ते को पेड़ से बदल देती है ।xxt >>= fyf y

एक आरेख यह स्पष्ट करता है, लेकिन मेरे पास आसानी से एक को खींचने के लिए सुविधाएं नहीं हैं!


14
आप लोग जो कह रहे हैं, वह यह है कि मुक्त मोदक ही फन्नेकार का आकार लेता है। तो अगर फ़नकार पेड़ के समान (उत्पाद) है, तो मुफ्त मोनाड पेड़ की तरह है; अगर यह सूची-जैसा है (रकम), मुफ्त मोनाड सूची-जैसा है; अगर यह फंक्शन की तरह है, तो फ्री मोनाड फंक्शन की तरह है; आदि यह मेरे लिए समझ में आता है। तो बस एक मुक्त मुद्रा में, आप पूरी तरह से नए तत्व बनाने के रूप में मैप्पेंड के हर आवेदन का इलाज करते रहते हैं; मुफ्त मोनाड में, आप फ़न्क्टर के हर अनुप्रयोग को एक नए तत्व के रूप में मानते हैं।
बार्टोज़ मिल्वस्की

4
भले ही फ़नकार एक "योग फ़नकार" है, जिसके परिणामस्वरूप फ़्री मोनड अभी भी पेड़ जैसा है। आप अपने पेड़ में एक से अधिक प्रकार के नोड के साथ समाप्त होते हैं: आपकी राशि के प्रत्येक घटक के लिए। यदि आपका "योग फनकार" एक्स -> 1 + एक्स है, तो वास्तव में आपको एक सूची मिलती है, जो कि पेड़ का एक पतित प्रकार है।
टॉम एलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.