सबसे पहले:
कोई भी मोनाड एक आवेदक फ़नकार है और कोई भी आन्तरिक फ़नकार एक फ़नकार है।
हास्केल के संदर्भ में यह सही है, लेकिन Applicative
सामान्य रूप से ( "मजबूत लक्स मोनॉयडल फ़ंक्टर" के रूप में पढ़ना ) सामान्य रूप से नहीं बल्कि इस कारण से है कि आपके पास अलग-अलग मोनोएडल श्रेणियों के बीच "आवेदक" फ़ंक्शंस हो सकते हैं, जबकि मोनाड (और कोमोनॉड्स) एंडोफुन्क्टर हैं ।
इसके अलावा, Applicative
मजबूत लैक्स मोनोएडल फंक्शनलर्स के साथ पहचान करना थोड़ा भ्रामक है, क्योंकि नाम को औचित्य देने के लिए (और प्रकार के हस्ताक्षर (<*>)
) को बंद मोनोएडल श्रेणियों के बीच एक फ़ंक्टर की आवश्यकता होती है जो मोनोइडल संरचना और आंतरिक होम दोनों को संरक्षित करता है । इसे बहुतायत से एक "लैक्स क्लोज्ड मोनोएडल फंक्टर" कहा जा सकता है, सिवाय इसके कि मोनॉइडल क्लोज्ड श्रेणियों के बीच एक फंक्टर जो या तो संपत्ति को संरक्षित करता है, दूसरे को स्पष्ट तरीके से संरक्षित करता है । क्योंकि Applicative
हास्क पर केवल एंडोफुन्क्टरों का वर्णन करता है, जिसकी मोनोक्डल संरचना को संरक्षित करते हुए (,)
, इसके उदाहरण स्वचालित रूप से अपनी ताकत सहित बहुत सारे गुण प्राप्त करते हैं , जो कि इस तरह से बढ़ सकता है।
के साथ स्पष्ट रूप से संबंध स्पष्ट Monad
रूप Applicative
से संयोग की सीमाओं की एक कलाकृति है, जिससे संबंधित संबंधित संरचनाओं के संयोग बनते हैं, एक सुखद संयोग जो दुर्भाग्य से दोहरीकरण से नहीं बचता है।
जिस प्रकार एक श्रेणी पर कॉमनोड , C o p पर एक मोनाड है , एक oplax monoidal functor C → D एक lax monoidal functor C o p → D o p है । लेकिन एच एक रों कश्मीर ओ पी monoidal नहीं है बंद कर दिया , और एक सह जो ऐसा नहीं करता समारोह आवेदन शायद ही गुण नाम शामिल हैं। वैसे भी, परिणाम बहुत दिलचस्प नहीं होगा:सीसीओ पी सी→ डीसीओ पी→ डीओ पीएचएक एस केओ पीApplicative
class (Functor f) => CoMonoidal f where
counit :: f () -> ()
cozip :: f (a, b) -> (f a, f b)
हम इसके बजाय "कोलैक्स क्लोज्ड फ़ेक्टर" की धारणा की कल्पना कर सकते हैं, जो मौजूद होने पर बहुत अधिक लगेगा Applicative
। दुर्भाग्य से, सब पर एक बंद श्रेणी (मेरी जानकारी के अनुसार करने के लिए) नहीं है: में एच एक रों कश्मीर morphisms से मेल खाती है ख → एक में एच एक रों कश्मीर ओ पी , लेकिन एक के रूप में काम नहीं करता है वहाँ आंतरिक Hom - क्योंकि तीर सह समारोह के कुछ प्रकार के बजाय की आवश्यकता होगी, जो हम के लिए सामान्य रूप में परिभाषित नहीं किया जा सकता उलट कर रहे हैं एच एक रों कश्मीर ।एचएक एस केओ पीnewtype Op b a = Op (a -> b)
एचएक एस केb → aएचएक एस केओ पीOp b a
एचएक एस के
हम बस यह है कि "colax बंद functors" नाटक तो लिए ही अस्तित्व में , और इसके अलावा जिस तरह से हम भोलेपन से आशा करता हूँ वे, एक सह में काम शायद इस प्रकार दिखाई देगा कि के आधार पर:HaskApplicative
class (Functor f) => CoApplicative f where
copure :: f a -> a
coap :: (f a -> f b) -> f (a -> b)
जोड़ने duplicate :: f a -> f (f a)
से copure
एक कोमोनॉड उत्पन्न होगा (यह मानते हुए कि कानून संतुष्ट हैं)। लेकिन इसके बीच कोई स्पष्ट संबंध नहीं है coap
- जो भी हो - और हो सकता है extend :: (f a -> b) -> f a -> f b
। प्रकार यह स्पष्ट है कि dualization अलग अलग तरीकों से हो रहा है हो जाता है तुलना: comonoidal संरचनाओं अंतर्निहित duplicate
और cozip
थोड़ा एक दूसरे के साथ या साथ क्या करना है coap
(जो शायद समझ में वैसे भी नहीं है), जबकि liftA2 (,)
और (<*>)
बराबर हैं और से प्राप्त किया जा सकता है join
।
दोहरीकरण का एक और संभावित तरीका Applicative
, जिसमें कॉमनॉड्स के साथ भी कम करना है, यह है कि कॉन्ट्रैविरिएंट मोनॉयडल फंक्शंस पर विचार करें:
class (Contravariant f) => ContraMonoidal f where
contraunit :: f a
contrazip :: f a -> f b -> f (Either a b)
लेकिन इसके बाद के संस्करण के रूप में ही मुद्दों के afoul इस रन, अर्थात् है कि एक बंद श्रेणी नहीं है। यदि यह थे, हम कुछ प्रकार होता है जैसे कि हम कार्यों लिख सकता है की तरह और और ताकि पर वास्तव में अपेक्षा के अनुरूप काम किया।Haskopb <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
HaskCoApplicative
हालांकि, एक monoidal बंद श्रेणी में दोहरीकरण के लिए अधिक मेहमाननवाज आप बेहतर भाग्य हो सकता है। विशेष रूप से, मेरा मानना है कि दोनों Kleisli (Cont r)
और इसकी विपरीत श्रेणी मोनॉयडल बंद है, ताकि इन विचारों का पता लगाने के लिए एक बेहतर संदर्भ हो सके।