ठीक है, आप निर्माण को दोहरा सकते हैं, लेकिन परिणामस्वरूप वर्ग का एकमात्र सदस्य खाली मज़ेदार है, जिसका मुफ़्त मोनड (पहचान मोनड) वास्तव में एक कॉमोनड भी है। बहुत रोमांचक नहीं है।
जो निर्माण आप वास्तव में संदर्भित करते हैं, उसे वास्तव में जाने के लिए बहुत कम जरूरत है, इसलिए हम हास्क के सामान को छोड़ दें और निम्नलिखित सामान्यता में काम करें। चलो
(सी, ⊗, 1) एक monoidal श्रेणी हो
एफ: सी -> सी एक monoid-मान functor, कि है, नक्शे 1 देखते हैं -> FX और FX ⊗ FX -> एफएक्स जो एक्स में प्राकृतिक हैं, और एकजुट और सहयोगी
TX = X ⊗ F (TX) परिभाषित करें। मान लें इस पुनरावर्ती परिभाषा किसी भी तरह समझ में आता है और हम टी पर पुनरावर्ती परिभाषाओं फिर हम निम्नलिखित संरचना नक्शे के साथ एक इकाई में टी कर सकते हैं कर सकते हैं:
इकाई
X = X ⊗ 1
-> X ⊗ F(TX) [unit map of F]
= TX
द्वारा दिए गए दिया शामिल होने के
T(TX) = TX ⊗ F(TTX)
= X ⊗ F(TX) ⊗ F(TTX)
-> X ⊗ F(TX) ⊗ F(TX) [join recursively under F]
-> X ⊗ F(TX) [multiplication of F]
= TX
जब ⊗ कार्तीय उत्पाद है द्वारा, इस निर्माण मीटर है एक वैकल्पिक फिक्स्चर पर मुफ्त कॉमोनैड पर ऑनड संरचना जिसे आप संदर्भित करते हैं। वास्तव में, वैकल्पिक संरचना का आवेदक हिस्सा अप्रासंगिक है। वैकल्पिक रूप से केवल वर्ग विधियों (प्लस फ़ैक्टर) की आवश्यकता होती है: एक मोनोइड-मूल्यवान फ़ैक्टर। तत्व के लिहाज से, चरण हैं, जो श्रृंगार के रूप में (k = id
की स्थापना करके) ऊपर वर्णित द्वारा
(x :< xs) :< xss -> (x :< xs, xss)
-> (x, xs, xss)
-> (x, xs, fmap join xss)
-> (x, xs <|> fmap join xss)
-> x :< (xs <|> fmap join xss)
दिया जाता है और यह आसानी से देखा जाता है में शामिल होने के
(a :< m) >>= k = case k a of
b :< n -> b :< (n <|> fmap (>>= k) m)
के साथ सहमत करने के बाद से हमारी प्रारंभिक संरचना तो कम से कम था , यह आसानी से दोहराया जाता है। तो (सी, ⊗, 1) एक monoidal श्रेणी होना जारी है, लेकिन अब मान लें
- जी: सी -> सी एक comonoid-मान functor, कि है, वहाँ नक्शे GX हैं -> 1 और GX -> GX ⊗ GX कि एक्स में प्राकृतिक रहे हैं, और counital और coassociative
फिर हम परिभाषित कर सकते हैं UX = एक्स ⊗ जी (UX) (फिर से यह सोचते हैं कि यह किसी भी तरह समझ में आता है) और दोहरी निर्माण द्वारा की संरचना के साथ यू लैस एक कॉमोनड यह वास्तव में असली जवाब है, लेकिन आपके विशिष्ट प्रश्न को संबोधित करने के लिए हमें विचार करना चाहिए कि some के कुछ ठोस विकल्पों के लिए क्या होता है।
सबसे पहले मान लीजिए ⊗ फिर कार्टेसियन उत्पाद है। फिर प्रत्येक मज़ेदार जी कॉमोनॉयडल-मूल्यवान तरीके से मूल्यवान होता है (वैवाहिकता जीएक्स -> जीएक्स एक्स जीएक्स विकर्ण होने के लिए)। तो किसी भी मज़ेदार जी के लिए, हमें कॉमोनैड यूएक्स = एक्स एक्स जी (यूएक्स) मिलता है। वास्तव में यह एक मज़ेदार निर्माण पर सामान्य कॉफ़्री कॉमोनैड (आपके नारे के "कोफ्री कॉमोनैड" भाग को न्यायसंगत बनाने के लिए बाहर निकलता है; जब एफ मोनोइड-मूल्यवान होता है तो हम जी = एफ सेट कर सकते हैं और जी स्वचालित रूप से कमोनो-मूल्यवान होता है, और फिर टी और यू के समान अंतर्निहित मज़ेदार है)।
डुबकी अगर ⊗ प्रजनन ⨿ है तो किसी भी जी जो कॉमोनॉयड-मूल्यवान है ⨿ के लिए भी एक अद्वितीय तरीके से ⨿ के लिए मानकीकृत मूल्यवान है, इसलिए यूएक्स = एक्स ⨿ जी (यूएक्स) जी पर मुफ़्त मोनड भी है एक comonad होने के रूप में अच्छी तरह से।
लेकिन हस्क में यूनिट ऑब्जेक्ट ⨿ के लिए ऑब्जेक्ट ऑब्जेक्ट खाली प्रकार 0 है, और जी के काउंटर को जीएक्स -> 0 टाइप करना चाहिए, जो केवल तभी संभव है जब सभी एक्स के लिए जीएक्स = 0 (यह किसी भी में सच है कार्टेशियन बंद श्रेणी)। तो, हास्क में इस निर्माण के कोई दिलचस्प उदाहरण नहीं हैं। समरूपता की यह कमी सेट की तरह श्रेणियों की एक आम घटना है।
अनुमान: 'खाली ::() -> fa',' (<|>) :: (एफए, एफए) -> एफए - तीरों को उलटकर हमें 'fa ->() ',' fa - > (एफए, एफए) ', जो ** हास्क ** में सबसे उपयोगी चीज नहीं है, हालांकि रैखिक प्रकार के सिस्टम में यह सार्थक है। – luqui
@luqui रैखिक प्रकार प्रणाली के बारे में अंतिम टिप्पणी दिलचस्प है, क्या आप कृपया इस पर विस्तृत जानकारी दे सकते हैं? –
वैकल्पिक का contravariant संस्करण [Decidable] है (http://hackage.haskell.org/package/contravariant-1.3.2/docs/Data-Functor-Contravariant-Divisible.html#t:Decidable)। यकीन नहीं है कि उस से कैसे चलना है, यद्यपि। – danidiaz