बड़ा अच्छा सवाल!
कई प्रमुख अंतर हैं।
प्रतिनिधित्व
- एक
newtype
गारंटी है कि आपके डेटा का रनटाइम में बिल्कुल वैसा ही प्रतिनिधित्व होगा, जैसा कि आप लपेटते हैं।
- जबकि
data
रनटाइम के दौरान एक नई डेटा संरचना की घोषणा करता है।
तो यहाँ मुख्य बात यह है कि निर्माण के लिए newtype
संकलन के को संकलन समय पर मिटाने की गारंटी है।
उदाहरण:
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
।
संदर्भ :