हास्केल में `डेटा` और` न्यूटाइप` के बीच अंतर


191

इसे लिखने पर मुझे क्या फर्क पड़ता है?

data Book = Book Int Int

बनाम

newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid

आपको आसपास कुछ खोज करनी चाहिए, इस सवाल का जवाब पहले ही दिया जा चुका है। stackoverflow.com/questions/2649305/…
तेहमान


इसके अलावा संबंधित: newtype के लिए उपयोग करता है: stackoverflow.com/questions/991467/…
डॉन स्टीवर्ट

25
ध्यान दें कि newtype Book = Book Int Intमान्य नहीं है। हालाँकि, आप newtype Book = Book (Int, Int)नीचे दिए गए डॉन्स द्वारा नोट कर सकते हैं।
एडवर्ड KMETT

जवाबों:


241

बड़ा अच्छा सवाल!

कई प्रमुख अंतर हैं।

प्रतिनिधित्व

  • एक newtypeगारंटी है कि आपके डेटा का रनटाइम में बिल्कुल वैसा ही प्रतिनिधित्व होगा, जैसा कि आप लपेटते हैं।
  • जबकि dataरनटाइम के दौरान एक नई डेटा संरचना की घोषणा करता है।

तो यहाँ मुख्य बात यह है कि निर्माण के लिए newtype संकलन के को संकलन समय पर मिटाने की गारंटी है।

उदाहरण:

  • data Book = Book Int Int

डेटा

  • newtype Book = Book (Int, Int)

नया प्रकार

ध्यान दें कि निर्माणकर्ता के मिट जाने के (Int,Int)बाद से उसके पास बिल्कुल वैसा ही प्रतिनिधित्व कैसे Bookहै।

  • data Book = Book (Int, Int)

डेटा टपल

में एक अतिरिक्त Bookनिर्माता मौजूद नहीं है newtype

  • data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

यहां छवि विवरण दर्ज करें

कोई संकेत नहीं! दो Intफ़ील्ड निर्माता में शब्द-रहित फ़ील्ड हैं Book

बीजीय डेटा प्रकार

इस वजह से कंस्ट्रक्टर को मिटाने की जरूरत है, एक एकल निर्माणकर्ता केnewtype साथ डेटा प्रकार को लपेटते समय एक ही काम करता है । "बीजीय" न्यूटाइपस की कोई धारणा नहीं है। अर्थात्, आप एक नया टाइप नहीं लिख सकते हैं, कहते हैं,

data Maybe a = Nothing
             | Just a

चूंकि इसमें एक से अधिक कंस्ट्रक्टर हैं। और न ही आप लिख सकते हैं

newtype Book = Book Int Int

सख़्ती

तथ्य यह है कि निर्माणकर्ता को मिटा दिया जाता है dataऔर बीच की सख्ती में कुछ बहुत ही सूक्ष्म अंतर होते हैं newtype। विशेष रूप से,data एक प्रकार का परिचय देता है जो "उठा हुआ" है, जिसका अर्थ है, अनिवार्य रूप से, यह एक निचला मान का मूल्यांकन करने का एक अतिरिक्त तरीका है। चूँकि रनटाइम के दौरान कोई अतिरिक्त कंस्ट्रक्टर नहीं है newtype, इसलिए यह संपत्ति धारण नहीं करता है।

में अतिरिक्त सूचक Bookहै(,) निर्माता हमें में एक नीचे मूल्य डाल करने के लिए अनुमति देता है।

नतीजतन, newtypeऔर dataथोड़ा अलग कठोरता गुण हैं, जैसा कि हास्केल विकी लेख में बताया गया है

बॉक्स से निकालना

इसका कोई मतलब नहीं है newtype, क्योंकि इसके कोई घटक नहीं हैं। हालांकि यह लिखना पूरी तरह से उचित है:

data T = T {-# UNPACK #-}!Int

एक Tनिर्माणकर्ता, और एक Int#घटक के साथ एक रनटाइम ऑब्जेक्ट उपज । तुम बस Intसाथ नंगे हो जाओ newtype


संदर्भ :


2
मुझे अभी भी नहीं लगता कि अगर हास्केल में "न्यूटाइप" नहीं होता तो मुझे कुछ याद आता। सूक्ष्म अंतर उस भाषा में जटिलता जोड़ते हैं जो मेरे लिए उचित नहीं लगती हैं ...
शहीद

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

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

3
@ एडम्लार सभी प्रकार के रनटाइम में मिट जाते हैं, वे सभी संकलन समय पर पूरी तरह से हल हो जाते हैं, और संकलन के दौरान newtypeस्पष्ट रूप से कम नहीं किया जाता है।
अर्धविराम

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