2012-02-15 16 views
52

मुझे पता है कि प्रकार के कॉन्वर्सिस और contravariance क्या हैं। मेरा सवाल यह है कि मैंने अभी तक हास्केल के अध्ययन में इन अवधारणाओं पर चर्चा क्यों नहीं की है (जैसा कि कहते हैं, स्कैला)?हास्केल में सह-और विरोधाभास के बारे में कई चर्चा क्यों नहीं हैं (स्कैला या सी # के विपरीत)?

ऐसा लगता है कि स्काला या सी # के विपरीत हास्केल दृश्य प्रकारों में एक मौलिक अंतर है, और मैं यह समझना चाहता हूं कि यह अंतर क्या है।

या हो सकता है मैं गलत हूँ और मैं बस इतना जान नहीं किया है हास्केल अभी तक :-)

+2

यह थोड़ी देर हो गया है, लेकिन मुझे इस वीडियो में सह/अनुबंध-भिन्नता के बारे में कुछ कार्यात्मक/हैकेलिश संवाद याद आ रहा है: http://channel9.msdn.com/shows/Going+Deep/E2E-Brian-Beckman-and -इरिक-मेजर- CoContravariance-in-Physics-and-Programming-2-of-2/ – steamer25

उत्तर

58

दो मुख्य कारण हैं:

  • हास्केल subtyping का एक अंतर्निहित धारणा का अभाव है, सामान्य रूप में तो भिन्नता कम प्रासंगिक है।
  • contravariance ज्यादातर प्रकट होता है जहां उत्परिवर्तन शामिल है, इसलिए हास्केल में अधिकांश डेटा प्रकार केवल कॉन्वेंटेंट होंगे और स्पष्ट रूप से इसे अलग करने के लिए बहुत कम मूल्य होगा।

हालांकि, अवधारणाओं को लागू करते हैं - उदाहरण के लिए, उठाने आपरेशन Functor उदाहरण के लिए fmap द्वारा किया जाता वास्तव में covariant है; मकान के बारे में बात करने के लिए श्रेणी सिद्धांत में शब्द सह-/ contravariance का उपयोग किया जाता है। contravariant package contravariant functors के लिए एक प्रकार की कक्षा को परिभाषित करता है, और यदि आप इंस्टेंस सूची देखते हैं तो आप देखेंगे कि मैंने क्यों कहा कि यह बहुत कम आम है।

वहाँ भी स्थानों पर जहां विचार परोक्ष दिखाता है, कैसे मैनुअल रूपांतरण काम में कर रहे हैं - विभिन्न सांख्यिक प्रकार वर्गों के लिए और Integer और Rational की तरह बुनियादी प्रकार से होने वाले रूपांतरण को परिभाषित, और मॉड्यूल Data.List कुछ मानक कार्यों के जेनेरिक संस्करण शामिल । आप the types of these generic versions को देखें, तो आप देखेंगे कि Integral की कमी (toInteger दे रही है) contravariant स्थिति में प्रकार पर उपयोग किया जाता है, जबकि Num की कमी (fromInteger दे रही है) covariant पद के लिए उपयोग किया जाता है।

+7

मुझे contravariance और mutability के बीच कोई संबंध नहीं दिखता है। वास्तव में, उत्परिवर्तन आविष्कार की ओर जाता है। Contravariance के उदाहरण कार्य इनपुट, 'Ord' और' Eq' (निश्चित रूप से उनके समकक्ष) हैं, जिनमें से कोई भी डेटा को उत्परिवर्तित करने के लिए भी है। –

+13

@ डैनियलसी। सोब्राल: एक म्यूटेबल संदर्भ को लिखना विरोधाभासी है, जो फ़ंक्शन इनपुट का एक विशेष मामला है। इसलिए जब सरल डेटा प्रकार अक्सर कॉन्वर्सिस की अनुमति देते हैं, ऐसे प्रकार जो contravariance सिंक या आउटपुट का प्रतिनिधित्व करते हैं, जो तब तक छोटे होने की संभावना है जब तक कि कुछ प्रकार के साइड इफेक्ट्स शामिल न हों। हालांकि, पढ़ने और लिखने के संचालन के साथ एक परिवर्तनीय संदर्भ जरूरी रूप से परिवर्तनीय है। –

+0

@ उत्परिवर्तन से संबंधित डैनियल कंट्रावायरियन [फ़ंक्शन के साथ] में देखा जा सकता है (http://hackage.haskell.org/packages/archive/snap/0.7/doc/html/Snap-Snaplet.html#v:with) प्रदान किया गया स्नैप फ्रेमवर्क के स्नैपलेट एपीआई द्वारा। यह "उत्परिवर्तनीय" राज्य के पदानुक्रमों को आसानी से छेड़छाड़ करने की अनुमति देने के लिए ठीक से डिजाइन किया गया था। – mightybyte

21

हास्केल में कोई "उप-प्रकार" नहीं है, इसलिए covariance और contravariance कोई समझ नहीं आता है।

स्कैला में, आपके पास उदा। Option[+A] सबक्लास Some[+A] और None के साथ। आपको Option[Bar]Foo extends Bar है, तो आपको एक Option[Bar] कहने के लिए covariance एनोटेशन + प्रदान करना होगा। उप-प्रकारों की उपस्थिति के कारण, यह आवश्यक है।

हास्केल में, कोई उप-प्रकार नहीं हैं। हास्केल में Option के बराबर, Maybe कहा जाता है, इस परिभाषा है:

data Maybe a = Nothing | Just a 

प्रकार चर a ही कभी एक प्रकार है, तो इसके बारे में कोई अधिक जानकारी के लिए आवश्यक है हो सकता है।

6

जैसा कि बताया गया है, हैस्केल में उपप्रकार नहीं हैं। हालांकि, अगर आप टाइपक्लास को देख रहे हैं तो यह स्पष्ट नहीं हो सकता है कि यह सबटाइपिंग के बिना कैसे काम करता है।

टाइपक्लास निर्दिष्ट प्रकारों पर भविष्यवाणी निर्दिष्ट करते हैं, स्वयं प्रकार नहीं। तो जब टाइपक्लास में सुपरक्लस होता है (उदा। ईक ए => ऑर्ड ए), इसका मतलब यह नहीं है कि उदाहरण उपप्रकार हैं, क्योंकि केवल भविष्यवाणियां विरासत में होती हैं, न कि प्रकार स्वयं।

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