দুর্দান্ত প্রশ্ন!
বেশ কয়েকটি মূল পার্থক্য রয়েছে।
প্রতিনিধিত্ব
- একটি
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।
তথ্যসূত্র :