रस्क में लक्षण और हस्केल में टाइपकास्ट के बीच क्या अंतर है?


157

रस्ट में लक्षण कम से कम सतही रूप से हास्केल में टाइपकास्ट के समान लगते हैं , हालांकि मैंने देखा है कि लोग लिखते हैं कि उनके बीच कुछ अंतर हैं। मैं बिल्कुल सोच रहा था कि ये अंतर क्या हैं।


8
मैं जंग के बारे में ज्यादा नहीं जानता। लेकिन अन्य भाषाओं में समान तकनीकों के लिए आम ठोकरें अधिक हैं (उदाहरण के तौर पर पैरामीटर पैरामीटर प्रकार पर रेंज कर सकते हैं, लेकिन उनके पैरामीटर नहीं?) और रिटर्न-टाइप पॉलीमॉर्फिज्म (उदाहरण के लिए, फ़ंक्शन के परिणाम में एक लक्षण प्रकार दिखाई दे सकता है, लेकिन कहीं भी नहीं। तर्कों में?)। हास्केल में पूर्व का एक उदाहरण है class Functor f where fmap :: (a -> b) -> (f a -> f b); उत्तरार्द्ध का एक उदाहरण है class Bounded a where maxBound :: a
डैनियल वैगनर

4
जीएचसी मल्टी-पैरामीटर प्रकार की कक्षाओं का समर्थन करता है (यानी, कई प्रकार के लक्षण शामिल हैं) और कार्यात्मक निर्भरताएं, हालांकि यह आधिकारिक हास्केल विनिर्देश का हिस्सा नहीं है। आपके लिंक पर सुझाए गए रस्ट सिंटैक्स से देखते हुए, यह केवल एक समय में एक से अधिक प्रकार के लक्षणों का समर्थन कर सकता है, हालांकि यह निर्णय फिर से गहरे अनुभव पर आधारित नहीं है।
डैनियल वैगनर

4
@DanielWagner रिटर्न-टाइप पॉलीमॉर्फिज़्म मौजूद है (जैसे std::default), और मल्टीमीटर व्यास कार्य की तरह (कार्यात्मक निर्भरता के एक एनालॉग सहित), हालांकि AFAIK को पहले पैरामीटर के विशेषाधिकार प्राप्त होने की आवश्यकता है। हालांकि एचकेटी नहीं। वे अभी तक भविष्य की इच्छा सूची में हैं, लेकिन अभी तक क्षितिज पर नहीं हैं।

4
एक और अंतर अनाथ उदाहरणों का उपचार है। जंग एक सख्त सुसंगतता नियम बनाने की कोशिश करती है जहां एक विशेषता के लिए एक नया इम्प्लांट लिखा जा सकता है। इस चर्चा को और अधिक विस्तार से देखें (विशेष रूप से यहाँ )
पाओलो फलाबेला

1
जंग जुड़े प्रकारों और समानता बाधाओं का समर्थन करती है, हालांकि वे हास्केल के प्रकार के परिवारों के समान शक्तिशाली नहीं हैं। यह भी विशेषता वस्तुओं के माध्यम से अस्तित्वगत प्रकार है ।
लैम्ब्डा फेयरी

जवाबों:


61

बुनियादी स्तर पर, बहुत अंतर नहीं है, लेकिन वे अभी भी वहां हैं।

हास्केल ने टाइपसीकल्स में परिभाषित कार्यों या मूल्यों का वर्णन 'विधियों' के रूप में किया है, जैसे लक्षण उन वस्तुओं में ओओपी विधियों का वर्णन करते हैं जिन्हें वे एनकोडिंग करते हैं। हालांकि, हास्केल इन सबसे अलग तरीके से पेश आते हैं, उन्हें ओओपी के रूप में एक वस्तु पर पिन करने के बजाय उन्हें व्यक्तिगत मूल्यों के रूप में मानते हैं। यह सबसे स्पष्ट सतह-स्तर अंतर के बारे में है।

एक चीज जो रस्ट कुछ समय के लिए नहीं कर सकती थी, वह उच्च-क्रम वाले टाइप किए गए लक्षण थे , जैसे कि कुख्यात Functorऔर Monadटाइपसेकल्स।

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

इसलिए यदि हम एक्सटेंशन को अनदेखा करते हैं, तो वे बिल्कुल समान नहीं हैं, लेकिन प्रत्येक अनुमानित कर सकते हैं कि दूसरे क्या कर सकते हैं।

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

सभी में, लक्षण और टाइपकास्ट में मूलभूत अंतर हैं, जो कि जिस तरह से वे बातचीत करते हैं, उसके कारण उन्हें अभिनय करते हैं और अंत में काफी समान लगते हैं।


Ell हास्केल के टाइपसेकल्स (उच्च-टाइप वाले सहित) पर एक अच्छा लेख यहां पाया जा सकता है , और उदाहरण के आधार पर जंग के लक्षण पर अध्याय यहां पाया जा सकता है


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

एसोसिएटेड आइटम अब कई परिस्थितियों में मुहावरेदार माना जाता है, है ना?
वेल्लस

@Vaelus आप सही हैं- इस उत्तर को थोड़ा अपडेट किया जाना चाहिए। अब संपादन कर रहे हैं।
AJFarmar 20

19

मुझे लगता है कि वर्तमान उत्तर रस्ट लक्षण और हास्केल प्रकार वर्गों के बीच सबसे बुनियादी अंतर को नजरअंदाज करते हैं। इन अंतरों का उस तरह से करना होता है जैसे लक्षण वस्तु उन्मुख भाषा निर्माण से संबंधित होते हैं। इसके बारे में जानकारी के लिए, रस्ट बुक देखें ।

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

    रनटाइम रेफरेंस वेरिएबल रनटाइम में विभिन्न प्रकार की ऑब्जेक्ट्स को शामिल कर सकता है, जब तक कि रनटाइम टाइप रेफरेंस ऑब्जेक्ट की विशेषता को लागू करता है।

    // The shape variable might contain a Square or a Circle, 
    // we don't know until runtime
    let shape: &Shape = get_unknown_shape();
    
    // Might contain different kinds of shapes at the same time
    let shapes: Vec<&Shape> = get_shapes();

    यह नहीं है कि किस प्रकार वर्ग काम करते हैं। प्रकार कक्षाएं कोई प्रकार नहीं बनाती हैं , इसलिए आप वर्ग नाम के साथ चर घोषित नहीं कर सकते। टाइप क्लास टाइप पैरामीटर पर सीमा के रूप में कार्य करते हैं , लेकिन टाइप पैरामीटर को एक ठोस प्रकार के साथ त्वरित किया जाना चाहिए, न कि टाइप क्लास के रूप में।

    आपके पास विभिन्न प्रकारों की विभिन्न चीजों की सूची नहीं हो सकती है जो एक ही प्रकार के वर्ग को लागू करते हैं। (इसके बजाय, समान चीज़ को व्यक्त करने के लिए Haskell में अस्तित्वगत प्रकार का उपयोग किया जाता है।) नोट 1

  2. विशेषता विधियों को गतिशील रूप से भेजा जा सकता है । यह दृढ़ता से उन चीजों से संबंधित है जो ऊपर अनुभाग में वर्णित हैं।

    डायनेमिक प्रेषण का अर्थ है कि संदर्भ बिंदु के ऑब्जेक्ट के रनटाइम प्रकार का उपयोग यह निर्धारित करने के लिए किया जाता है कि किस विधि को संदर्भ कहा जाता है।

    let shape: &Shape = get_unknown_shape();
    
    // This calls a method, which might be Square.area or
    // Circle.area depending on the runtime type of shape
    print!("Area: {}", shape.area());

    फिर, हास्केल में इसके लिए अस्तित्वगत प्रकार का उपयोग किया जाता है।

निष्कर्ष के तौर पर

ऐसा लगता है कि लक्षण कई पहलुओं में हैं जैसे कि एक ही अवधारणा प्रकार की कक्षाएं। इसके अलावा, उनके पास ऑब्जेक्ट ओरिएंटेड इंटरफेस की कार्यक्षमता है।

दूसरी ओर हास्केल के प्रकार की कक्षाएं अधिक उन्नत हैं। हास्केल के उदाहरण उच्च श्रेणी के प्रकार और बहु-पैरामीटर प्रकार वर्ग जैसे विस्तार हैं।


नोट 1 : रस्ट के हाल के संस्करणों में प्रकार के रूप में विशेषता नामों के उपयोग और सीमा नाम के रूप में विशेषता नामों के उपयोग को अलग करने का एक अद्यतन है। एक लक्षण प्रकार में नाम को dynकीवर्ड द्वारा उपसर्ग किया जाता है । उदाहरण के लिए देखें यह उत्तर अधिक जानकारी के लिए।


2
"टाइप कक्षाएं कोई प्रकार नहीं बनाती हैं" - मुझे लगता है कि dyn Traitअस्तित्वगत टाइपिंग के रूप में समझना सबसे अच्छा है क्योंकि वे लक्षण / प्रकार-कक्षाओं से संबंधित हैं। हम dynसीमा पर एक ऑपरेटर पर विचार कर सकते हैं उन्हें टाइप करने के लिए, यानी dyn : List Bound -> Type। हास्केल के लिए इस विचार को ले जाना, और "इसलिए आप वर्ग नाम के साथ चर घोषित नहीं कर सकते।", हम इसे हास्केल में अप्रत्यक्ष रूप से कर सकते हैं data Dyn (c :: * -> Constraint) = forall (t :: Type). c t => D t:। इसे परिभाषित करने के बाद, हम साथ काम कर सकते हैं [D True, D "abc", D 42] :: [D Show]
सेंट्रील

8

रस्ट के "लक्षण" हास्केल के प्रकार वर्गों के अनुरूप हैं।

हास्केल के साथ मुख्य अंतर यह है कि केवल डॉट a.foo (b) के रूप में डॉट नोटेशन के साथ अभिव्यक्ति के लिए हस्तक्षेप करता है।

हास्केल प्रकार की कक्षाएं उच्च-क्रम प्रकारों तक विस्तारित होती हैं। जंग लक्षण केवल उच्च क्रम प्रकारों का समर्थन नहीं करते क्योंकि वे पूरी भाषा से गायब हैं, अर्थात यह लक्षण और प्रकार वर्गों के बीच एक दार्शनिक अंतर नहीं है


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