2016-01-11 5 views
11

मोनाड्स Functor टाइपक्लास से प्राप्त करें। Cofunctor कक्षा में परिभाषित विधि को कॉमोनैड को cofmap विधि की आवश्यकता क्यों नहीं है?हास्केल में कोई 'कोफंक्टर' टाइपक्लास क्यों नहीं है?

class Functor f where 
    fmap :: (a -> b) -> (f a -> f b) 

Cofunctor में परिभाषित किया जा सकता है इस प्रकार है::

+4

ऐसा इसलिए है क्योंकि एक cofunctor एक functor के रूप में ही है। दोनों के बीच कोई अंतर नहीं है। हालांकि, monads और comonads अलग हैं। यद्यपि एक contravariant functor के रूप में ऐसी चीज है, हालांकि 'contramap' विधि के साथ जिसमें' contravariant f => (a -> b) -> f b -> f a' प्रकार है। हालांकि, यह एक कोफंक्टर के समान नहीं है। –

+0

क्या आपका मतलब है "कोफंक्टर" एक मज़ेदार के दोहरे (जो कि केवल एक मज़ेदार है, क्योंकि यह स्वयं-दोहरी है), या एक मज़ेदार का मतलब है जो contravariant है? http://math.stackexchange.com/questions/394472/is-cofunctor-an-accepted-term-for-contravariant-functors –

उत्तर

19

Functor के रूप में परिभाषित किया गया है

class Cofunctor f where 
    cofmap :: (b -> a) -> (f b -> f a) 

तो, दोनों तकनीकी रूप से ही कर रहे हैं, और यही कारण है Cofunctor मौजूद नहीं है है। "सामान्य में 'मज़ेदार' की दोहरी अवधारणा अभी भी 'सामान्य रूप से मजेदार' है।

चूंकि Functor और Cofunctor समान हैं, दोनों monads और comonads को Functor का उपयोग करके परिभाषित किया गया है। लेकिन यह आपको ऐसा नहीं लगता कि मोनैड और कॉमोनैड एक ही बात हैं, वे नहीं हैं।

class Functor m => Monad where 
    return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 

एक comonad (फिर से, सरलीकृत) है या नहीं:

एक इकाई के रूप में परिभाषित (सरल बनाने) है

class Functor w => Comonad where 
    extract :: w a -> a 
    extend :: (w a -> b) -> w a -> w b 

नोट "समरूपता"। ,

import Data.Functor.Contravariant 
class Contravariant f where 
    contramap :: (b -> a) -> (f a -> f b) 
+6

एक मजेदार सी -> डी एक मज़ेदार डी -> सी के दोहरी नहीं होगा? तो ** ** ** मल्टीटर का दोहरी एक ही मज़ेदार नहीं है, लेकिन "सामान्य में मज़ेदार" की दोहरी अवधारणा अभी भी "सामान्य रूप से मजेदार" है। मुझे लगता है कि मैं सिर्फ अर्थशास्त्र खेल रहा हूं, लेकिन "एक मज़ेदार में यह भाषा दोहरी है" इस दावे की तरह लगता है कि व्यक्तिगत मज़ेदार किसी भी तरह से अपने स्वयं के विपरीत या कुछ के रूप में प्रयोग योग्य हैं। – Ben

+0

@ बेन आप सही हैं। मैंने इसे सही किया। –

+0

@ बेन औपचारिक परिभाषा के लिए कम या ज्यादा हिलाता है: https://en.wikipedia.org/wiki/Equivalence_of_categories#Definition – Zaaier

3

संदर्भ के लिए

class Functor w => Comonad w where 
    extract :: w a -> a 
    duplicate :: w a -> w (w a) 
    extend :: (w a -> b) -> w a -> w b 

instance Applicative m => Monad m where 
    return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 

join :: Monad m => m (m a) -> m a 

ध्यान दें कि extract दिया और extend आप fmap और duplicate उत्पादन कर सकते हैं, और कहा कि दिए गए:


एक और बात एक contravariant functor, के रूप में परिभाषित किया गया है return और >>= आप fmap,का उत्पादन कर सकते हैं, <*>, और join। तो हम केवल pure + >>= और extract + extend पर ध्यान केंद्रित कर सकते हैं।

मैं कल्पना आप की तरह

class InverseFunctor f where 
    unmap :: (f a -> f b) -> a -> b 

चीज़ की तलाश में हो सकता है के बाद से Monad वर्ग यह आसान है, जबकि केवल काल्पनिक दृष्टिकोण का एक तरह की अनुमति के लिए "बातें बाहर ले" "में बातें डाल" के लिए बनाता है, और Comonad क्या इसका विरोध कुछ करता है, आपका अनुरोध शुरू में समझदार लगता है। हालांकि, >>= और extend के बीच एक महत्वपूर्ण असमानता है जो unmap को परिभाषित करने के किसी भी प्रयास के रास्ते में पहुंच जाएगी। विशेष रूप से ध्यान दें कि >>= के पहले तर्क में m a टाइप किया गया है। extend का दूसरा तर्क टाइप w aa है।

+0

हम एक अनैप परिभाषित कर सकते हैं: "unmap f = निकालें। F। वापसी" और हस्ताक्षर टाइप करें "अनमैप :: मोनाड एफ, कॉमोनैड एफ => (एफए -> एफबी) -> ए -> बी" – Stratege

संबंधित मुद्दे