बड़ा अच्छा सवाल!
कई प्रमुख अंतर हैं।
प्रतिनिधित्व
- एक
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।
संदर्भ :